关于hibernate的createSQLQuery两个限制

由于涉及到到的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;
}

});

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值