`
newslxw
  • 浏览: 208781 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

关于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;
								}
                        		
                        	});

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics