Hibernate addScalar() addEntity() setResultTransformer() 返回的数据集合转为指定类或Map 等 使用以及学习总结

一般的list 返回值

通常情况下如果我们直接使用了sqlquery 的 .list() 方法,返回的结果将为一个 Object[] 数组,如果字段不多还好,如果很多,那么手动一个个转换将会十分麻烦,而通过 addScalar() addEntity() setResultTransformer() 可以极大的简化这一过程,即可以将 Hibernate 结果的很多字段直接转为 对应的实体,或指指定的实体,或者Map 等等简化这一过程。

这样的基本的 list() 被成为标量查询。(我理解可能是返回的标准量度或者标准量?不纠结了,继续向下 )

addEntity()

通过该种方式可以直接将 某一张表的全部列转为对应的 持久化实体,说白了就是你的库里面的所有字段对应的 Entity, 而且这个类上自然已经标注了每一个实体属性对应的列名称,从而 hibernate 自己可以识别出来。

从一般的用法来看前提如下:

  1. 返回的是某一张表的全部字段,addEntity 时,选择对应的 entity 的 .class 即可。

示例:

session.createSQLQuery("select * from person_t1").addEntity(Person.class).list();  

最终的返回结果即为 List< Person> 类型;

addScalar() 作用

由于一般的 list() 返回的都是 object[] 那么每一个元素都是object 我们不得不去做一个转型才能执行后续的业务操作,而此处 addScalar() 就是对 查询结果指定字段 进行类型转换使得结果出来的类型就是我们预期的类型。

标量查询中 addScalar() 方法的两个作用

 1、指定查询结果包含哪些数据列---没有被addScalar选出的列将不会包含在查询结果中。
 2、指定查询结果中数据列的数据类型

标量查询
将返回一个Object数组组成的List,数组每个元素都是表的一个字段值。Hibernate会使用ResultSetMetadata来判定返回的标量值的实际顺序和类型。
但是在JDBC中过多的使用 ResultSetMetadata 会降低程序的性能。所以为了避免过多的使用ResultSetMetadata 或为了指定更加明确的返回值类型,可以使用addScalar()方法:

示例代码:

session.createSQLQuery("select * from person_t")   
.addScalar("name",StandardBasicTypes.STRING)  
.addScalar("age",StandardBasicTypes.INT)  
.list();  

也可以不指定类型,只说明要那一列的值
addScalar(String columnAlias)
不过一般也不会这样干,要什么我们就查询什么,需要注意的是 addScalar 内的字段一定要在 查询结果的列中 否则会出现异常

如上所说,如果指定了 addScalar 中的列,那么返回的结果中只会包含添加到 addScalar 中的列,即使查询的比这个多也不会返回。

当然这不是单独使用的继续向下
当想将多个表的指定列或者自定义列转为我们指定的实体或Map 时我们可以连用setResultTransformer()

setResultTransformer()

setResultTransformer 会对查询的结果进行转化,使查询的结果映射到指定的对象或者Map List 中。

Map 转化
示例:

session.createSQLQuery("select * from person_t")   
.addScalar("name",StandardBasicTypes.STRING)  
.addScalar("age",StandardBasicTypes.INT)  
.setResultTransformer(Transformers.ALIAS_TO_ENTITY_MAP).list();

此时最终的结果即可从 map 中获取,同时key 即为列名或别名。

转为一般指定的类
示例:

StringBuilder sql = new StringBuilder();

//创建SQLQuery对象
SQLQuery sqlQuery = sessionFactory.getCurrentSession().createSQLQuery(sql.toString());
//调用addScalar
sqlQuery.addScalar("column1", StandardBasicTypes.LONG);
sqlQuery.addScalar("column2", StandardBasicTypes.STRING);
sqlQuery.addScalar("column3", StandardBasicTypes.STRING);
//设置取的结果集行数
sqlQuery.setFirstResult(...); // 为整正数,即从第几条开始加入结果集
sqlQuery.setMaxResults(...);   // 最多共加入多少条数据
// 对象转化为指定的类
sqlQuery.setResultTransformer(Transformers.aliasToBean(PersonDTO.class));
//返回TestCto的List列表
return sqlQuery.list();

最终结果集为 List< PersonDTO>
需要注意
使用
setResultTransformer(Transformers.aliasToBean(PersonDTO.class))
转化时需要确认 sql 查询的结果集列名或别名一定要和 指定的类 PersonDTO 中的名称以及类型均一致,PersonDTO 中的属性可以多余 sql查询的结果集

setFirstResult(),setMaxResults()

指定结果的开始位置,以及查询的最大值 类似于分页的 从第多少条开始,查询多少条。

关键点示例如下:

query.setFirstResult(params.getStartRow())
.setMaxResults(params.getPageSize())
.list();

特殊指定 日期以及 byte[]

当实体存在 Date 类型,以及 byte[] 可以如下 指定

Date

query.addScalar("createTime" ,StandardBasicTypes.TIMESTAMP);

byte[]

query.addScalar("bytesData" ,StandardBasicTypes.BINARY);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值