您的位置:首页 > 数据库

Hibernate执行原生sql将查询结果直接转为VO

2015-09-16 11:41 525 查看
Hibernate提供的hql虽然可以很方便的将查询结果转换为相应实体,而不是结果集。但是在实际使用中,对于非常复杂的

sql,比如在做报表时,sql可能会比较复杂,这是使用hql可能无法满足需求。不过Hibernate也提供了许多直接执行原生sql

的方法,可是返回的结果只能是结果集。如果对于每个返回的结果进行set操作以转换成需要的bean,对于返回结果很多时,是一件

不小的工作了,而且代码实现上也不美观。

这时可以考虑使用createSQLQuery()方法,通过Transformers对象进行直接将结果集映射需要的bean。

Session的createSQLQuery(String sql),参数就是要执行的sql 语句,返回类型为Query 类型的实例。

在使用过程中,可以使用addScalar方法指定对应的字段名,这样可以避免大小写的问题。我在使用中中,发现Hibernate在和

orcale一起时,会将所有的字段名转化为全大写的字段,这时如果不指定,而bean我们定义的字段不是大写就会报错–bean里没有

指定字段。

同时addScalar(String columnAlias, Type type)还可以指定字段的类型,因为不同的数据库在映射Java数据类型时有些需要指定。

StringBuffer sb = new StringBuffer("select t.bis_store_id as bisStoreId, bf.charge_type as chargeType, ");
sb.append(" bf.building_num || ' ' || bf.floor_num as buildingNum, t.store_no as storeNo");
sb.append(" from bis_store t, bis_floor bf, bis_project bp where t.bis_floor_id = bf.bis_floor_id");

List volist=bisProjectManager.getDao().getSession().createSQLQuery(sb.toString())
.addScalar("bisStoreId")
.addScalar("chargeType",Hibernate.STRING)
.addScalar("buildingNum")
.addScalar("storeNo")
.setResultTransformer(Transformers.aliasToBean(Vo.class)).list();


bean就不用写了,无非就是一些属性定义和getter,setter。

当然,如果Transformers类不能满足特殊的需求,也可以自定义一个转换类,只要继承Transformers就好。

这个以后有机会再补,这次遇到的问题通过以上方法就可以解决了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: