由于涉及到到的SQL查询,SQL长度超出4000字符,不得不使用createSQLQuery,
使用中发现如下两个限制如下:
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;
}
});