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

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就好。
这个以后有机会再补,这次遇到的问题通过以上方法就可以解决了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值