论坛首页 Java企业应用论坛

关于hibernate的createSQLQuery两个限制

浏览 3002 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2011-09-22  
由于涉及到到的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;
								}
                        		
                        	});

   发表时间:2011-09-22  
我一直以为createSQLQuery就是和普通的jdbc查询一样。看不出你遇到的问题是什么。
0 请登录后投票
   发表时间:2011-09-22  
aa87963014 写道
我一直以为createSQLQuery就是和普通的jdbc查询一样。看不出你遇到的问题是什么。


你给字段起别名就知道区别了,HIBERNATE会告诉你编译不通过
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics