Hibernate addScalar() addEntity() setResultTransformer() 返回的数据集合转为指定类或Map 等 使用以及学习总结
一般的list 返回值
通常情况下如果我们直接使用了sqlquery 的 .list() 方法,返回的结果将为一个 Object[] 数组,如果字段不多还好,如果很多,那么手动一个个转换将会十分麻烦,而通过 addScalar() addEntity() setResultTransformer() 可以极大的简化这一过程,即可以将 Hibernate 结果的很多字段直接转为 对应的实体,或指指定的实体,或者Map 等等简化这一过程。
这样的基本的 list() 被成为标量查询。(我理解可能是返回的标准量度或者标准量?不纠结了,继续向下 )
addEntity()
通过该种方式可以直接将 某一张表的全部列转为对应的 持久化实体,说白了就是你的库里面的所有字段对应的 Entity, 而且这个类上自然已经标注了每一个实体属性对应的列名称,从而 hibernate 自己可以识别出来。
从一般的用法来看前提如下:
- 返回的是某一张表的全部字段,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);
Hibernate addScalar() addEntity() setResultTransformer() 返回的数据集合转为指定类或Map 等 使用以及学习总结相关推荐
- java rowmapper 通用实现_RowMapper实现自动将一行数据映射到指定类的实例中
Spring 2.5 提供了一个便利的RowMapper实现-----BeanPropertyRowMapper 它可自动将一行数据映射到指定类的实例中 它首先将这个类实例化,然后通过名称匹配的方式, ...
- Winform中怎样使用HttpClient调用http的get和post接口并将接口返回json数据解析为实体类
场景 需要在Winform的页面初始化之后,调用http的接口,并将返回的json数据 解析,赋值到窗体中的TextBox组件中. 使用接口测试工具测试的接口返回数据如下 注: 博客: 霸道流氓气质的 ...
- java中使用ajax请求数据格式化,ajax请求服务器返回json数据格式化
JQuery--实现Ajax应用 实现Ajax应用 1 .load()异步请求数据,通过Ajax请求加载服务器中的数据,并把返回的数据放置到指定的元素中,调用格式为load(url,[data], ...
- Map集合转为实体对象
Map集合转为实体对象 源码:https://gitee.com/Jakewabc/small-study-case/blob/master/nm-demo/mongodb-demo/src/main ...
- Hibernate使用原生SQL适应复杂数据查询
HQL尽管容易使用,但是在一些复杂的数据操作上功能有限.特别是在实现复杂的报表统计与计算,以及多表连接查询上往往无能为力,这时可以使用SQL(Native SQL)实现HQL无法完成的任务. 1.使用 ...
- 对比两个同类型的泛型集合并返回差异泛型集合 ——两个List类名的比较
1: /// <summary> 2: /// 对比两个同类型的泛型集合并返回差异泛型集合 3: /// </summary> 4: /// <typeparam nam ...
- iOS处理高并发量的数据请求和数据集合的对应关系
一.处理高并发请求的核心代码如下: // 创建信号量dispatch_semaphore_t semaphore = dispatch_semaphore_create(0);// 创建全局并行dis ...
- Paddle中的数据集合定义与加载
简 介: 为了高效利用PaddlePaddle的训练框架, fit(), 基础框架,本文给出了在PaddlePaddle中代码框架中给定的数据准备方法.利用这些方法,利用这些方法可以获得构造Paddl ...
- Struts2返回JSON数据的具体应用范…
Struts2返回JSON数据的具体应用范例 博客分类: Struts2 Struts2JSON 早在我刚学Struts2之初的时候,就想写一篇文章来阐述Struts2如何返回JSON数据的原理和具 ...
最新文章
- Chrome 提标 您的浏览器限制了第三方Cookie...解决方法
- No-PDO-Models-MySQL数据库层抽象类
- weiler-atherton多边形裁剪算法_EAST算法超详细源码解析:数据预处理与标签生成...
- boost使用Proto转换来实现的例子
- android:allowBackup=true 数据备份(adb backup)+查看(abe unpack backup.ab backup.tar)+恢复(adb re)
- Java 开发人员必知必会的 20 种常用类库和 API
- 微软认知服务应用秘籍 – 与机器人聊知识
- 即时通讯工具腾讯 QQ v9.1.9.26361 绿色便携版
- 【转载】英语动词过去式ed的发音规则
- SpringBoot项目打包成jar后,使用ClassPathResource获取classpath(resource)下文件失败
- efficientnet
- 用Python带大家写个自动生成艺术签名的小工具哟~
- 第一章 | 加州房价数据集 | 端到端的机器学习 | 回归问题 | tensorflow2.6+sklearn | 学习笔记
- 微信小程序实现当前页面多个视频文件只能播放一个视频,其他视频暂停,点击当前暂停当前
- layui 实现下拉多选功能 [xm-select]
- 【集大成篇】数据类型( C、C++、Java )对比
- 知到网课艺术与审美考试试题以及答案
- 企业申报两化融合有哪些好处 申报两化融合需要准备哪些材料
- 安卓手机怎么设置蓝牙耳机弹窗动画_链接重推其他团无线蓝牙耳机
- OmniPeek tools install and setting