hibernate 原生sql查询的结果集处理

主要是谈怎么拼装 转换结果 其中涉及的主要是怎么理解 Object[] ojbArr
这个是Object[] 是说结果集的每一列 是一个 Object数组。而不是说所有的结果集整个是个Object数组。


直接看我的代码例子吧,好理解些。



@Transactional(propagation=Propagation.REQUIRED, readOnly=false)
public List<DomainTagRank> getDomainTagRank(String domain){
String sql = "select tag_name, count(*) from bookmark b, bookmark_tag_relation r, tag t where b.domain = ? and b.id = r.bookmark_id and t.id = r.tag_id GROUP BY t.tag_name ORDER BY count(*) desc";
SQLQuery sqlQuery = this.getSession().createSQLQuery(sql);
sqlQuery.setParameter(0, domain);
List list = sqlQuery.list();

List<DomainTagRank> resList = new ArrayList<DomainTagRank>();
for (int i=0; i<list.size(); i++){
Object[] objArr = (Object[])list.get(i);
DomainTagRank domainTagRank = new DomainTagRank();
domainTagRank.setDomain(domain);
domainTagRank.setTagName(objArr[0].toString());
domainTagRank.setCount(Integer.parseInt(objArr[1].toString()));
domainTagRank.setRank(i+1);
domainTagRank.setUserCount(getUserCountOfOneDomainTag(domain, domainTagRank.getTagName()));
resList.add(domainTagRank);
}
return resList;
}



下面是别的地方的文字说明,反正也可以看下,便于理解整个到底怎么回事。

原文章地址:http://langgufu.iteye.com/blog/1565397

使用hibernate3的createSQLQuery遇到的问题
为了给访问加速,把DAO中的一些HQL的操作改成了SQL,其实最主要的原因是:操作的是多张表,返回的数据也来源于多个表的字段;
String sql = “select A.id ID, A.name NAME, B.salary SALARY from employee A , Salary B where.......”;
Query query =getSession().createSQLQuery(sql)
.setResultTransformer(Transformers.aliasToBean(ReturnEmployee.class));
由于返回的ID, NAME, SALARY 非一个和表对应的一个BEAN,所以自己需要建立一个ReturnEmployee的BEAN,属性包括ID, NAME, SALARY;在mysql下调试,成功。
但是在ORACLE环境下却报错:

org.hibernate.PropertyNotFoundException: Could not find setter for ID on class com.ReturnEmployee

经过几个小时的查错,调试,没有发现问题的所在,只能摆脱GOOGLE了,最后在国外的一个论坛上找到了答案:

this is actually a limitation of some databases which return alias all uppercase instead of using the casing you actually specified.

until then use .addScalar(..) to workaround it.

原来是Hibernate对ORALCE的支持有BUG,所以修改代码为:
Query query = getSession().createSQLQuery(sql).addScalar("ID")
.addScalar("NAME").addScalar("SALARY");
就可以了,需要注意的是
List employeeData = query.list();
返回的employeeData 中的数据是object[],这样取值:
List employeeBean = new ArrayList();
for (int i = 0; i < employeeData.size(); i++) {
Employee employee = new Employee();//把"裸"数据组装到自己的employee类

Object[] object = (Object[]) employeeData.get(i);
employee.setId(object[0].toString());
employee.setName(object[1].toString());
employee.setOrgType(object[2].toString());

employeeBean.add(employee);
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值