浏览 3002 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2011-09-22
使用中发现如下两个限制如下: 1、字段别名限制,如果这个字段不是属于GROUP BY中的字段或者SUM等函数的结果,HIBERNATE就不识别。 如:select a.name n from test a就不行 但是 select a.name n,sum(num) as totalnum from test group by name就可以 2、SQL中字段的名称如果重复,后面字段的值就会被第一个同名字段的值覆盖。 如:select a.name n, a.id n from test 这个问题也不是HIBERNATE的问题,SPRING的JDBCTEMPLATE也有这个问题, 不过这也是SQL怪异,一般SQL起别名都不会重复。 其原因是hibernate和spring都是用映射来获取数据库值而不是用索引。 我考虑的HIBERNATE对原生SQL支持不好,将所有SQL查询的都用SPRING来实现了, 自己写了个rowmapper来防止别名重复被替换的问题。 下面代码之所以以数组对象返回时为了和hibernate的query.list保持一致 List list = SpringUtils.getJdbcTemplate().query(countHql, values, new RowMapper(){ public Object mapRow(ResultSet rs, int rowNum) throws SQLException { ResultSetMetaData rsmd = rs.getMetaData(); int nrOfColumns = rsmd.getColumnCount(); if(nrOfColumns == 1) return JdbcUtils.getResultSetValue(rs,1); Object ret[] = new Object[nrOfColumns]; for(int i=1; i<=nrOfColumns ; i++) { ret[i-1] = JdbcUtils.getResultSetValue(rs,i); } return ret; } }); 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2011-09-22
我一直以为createSQLQuery就是和普通的jdbc查询一样。看不出你遇到的问题是什么。
|
|
返回顶楼 | |
发表时间:2011-09-22
aa87963014 写道 我一直以为createSQLQuery就是和普通的jdbc查询一样。看不出你遇到的问题是什么。
你给字段起别名就知道区别了,HIBERNATE会告诉你编译不通过 |
|
返回顶楼 | |