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数据类型时有些需要指定。
bean就不用写了,无非就是一些属性定义和getter,setter。
当然,如果Transformers类不能满足特殊的需求,也可以自定义一个转换类,只要继承Transformers就好。
这个以后有机会再补,这次遇到的问题通过以上方法就可以解决了。
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就好。
这个以后有机会再补,这次遇到的问题通过以上方法就可以解决了。
相关文章推荐
- oracle中直方图的使用
- 数据迁移至RDS-MySQL之利用RDS管理控制台
- oracle中distinct的用法详解
- jdbc操作mysql数据库实例
- mysql允许外部连接
- mysql 查看负载
- mybatis+MySQL数据库返回插入记录的关键字方法
- 数据库相关知识点
- Oracle 和pl/sql以及pl/sql developer
- 索引扫描与索引查找的区别
- redis+mc review
- SQL注入攻防入门详解
- Redis如何处理客户端连接
- jdbc连接 mysql 数据库
- Mysql数据库int(1)和tinyint(1)的区别&&扩展阅读
- How to embed Oracle hints in Hibernate query
- 详解sqlserver查询表索引
- 解读Redis运行核心循环过程
- oracle 数据库状态查询
- Oracle自增ID实现