一般的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);

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

  1. java rowmapper 通用实现_RowMapper实现自动将一行数据映射到指定类的实例中

    Spring 2.5 提供了一个便利的RowMapper实现-----BeanPropertyRowMapper 它可自动将一行数据映射到指定类的实例中 它首先将这个类实例化,然后通过名称匹配的方式, ...

  2. Winform中怎样使用HttpClient调用http的get和post接口并将接口返回json数据解析为实体类

    场景 需要在Winform的页面初始化之后,调用http的接口,并将返回的json数据 解析,赋值到窗体中的TextBox组件中. 使用接口测试工具测试的接口返回数据如下 注: 博客: 霸道流氓气质的 ...

  3. java中使用ajax请求数据格式化,ajax请求服务器返回json数据格式化

    JQuery--实现Ajax应用 实现Ajax应用 1   .load()异步请求数据,通过Ajax请求加载服务器中的数据,并把返回的数据放置到指定的元素中,调用格式为load(url,[data], ...

  4. Map集合转为实体对象

    Map集合转为实体对象 源码:https://gitee.com/Jakewabc/small-study-case/blob/master/nm-demo/mongodb-demo/src/main ...

  5. Hibernate使用原生SQL适应复杂数据查询

    HQL尽管容易使用,但是在一些复杂的数据操作上功能有限.特别是在实现复杂的报表统计与计算,以及多表连接查询上往往无能为力,这时可以使用SQL(Native SQL)实现HQL无法完成的任务. 1.使用 ...

  6. 对比两个同类型的泛型集合并返回差异泛型集合 ——两个List类名的比较

    1: /// <summary> 2: /// 对比两个同类型的泛型集合并返回差异泛型集合 3: /// </summary> 4: /// <typeparam nam ...

  7. iOS处理高并发量的数据请求和数据集合的对应关系

    一.处理高并发请求的核心代码如下: // 创建信号量dispatch_semaphore_t semaphore = dispatch_semaphore_create(0);// 创建全局并行dis ...

  8. Paddle中的数据集合定义与加载

    简 介: 为了高效利用PaddlePaddle的训练框架, fit(), 基础框架,本文给出了在PaddlePaddle中代码框架中给定的数据准备方法.利用这些方法,利用这些方法可以获得构造Paddl ...

  9. Struts2返回JSON数据的具体应用范…

    Struts2返回JSON数据的具体应用范例 博客分类: Struts2 Struts2JSON  早在我刚学Struts2之初的时候,就想写一篇文章来阐述Struts2如何返回JSON数据的原理和具 ...

最新文章

  1. Chrome 提标 您的浏览器限制了第三方Cookie...解决方法
  2. No-PDO-Models-MySQL数据库层抽象类
  3. weiler-atherton多边形裁剪算法_EAST算法超详细源码解析:数据预处理与标签生成...
  4. boost使用Proto转换来实现的例子
  5. android:allowBackup=true 数据备份(adb backup)+查看(abe unpack backup.ab backup.tar)+恢复(adb re)
  6. Java 开发人员必知必会的 20 种常用类库和 API
  7. 微软认知服务应用秘籍 – 与机器人聊知识
  8. 即时通讯工具腾讯 QQ v9.1.9.26361 绿色便携版
  9. 【转载】英语动词过去式ed的发音规则
  10. SpringBoot项目打包成jar后,使用ClassPathResource获取classpath(resource)下文件失败
  11. efficientnet
  12. 用Python带大家写个自动生成艺术签名的小工具哟~
  13. 第一章 | 加州房价数据集 | 端到端的机器学习 | 回归问题 | tensorflow2.6+sklearn | 学习笔记
  14. 微信小程序实现当前页面多个视频文件只能播放一个视频,其他视频暂停,点击当前暂停当前
  15. layui 实现下拉多选功能 [xm-select]
  16. 【集大成篇】数据类型( C、C++、Java )对比
  17. 知到网课艺术与审美考试试题以及答案
  18. 企业申报两化融合有哪些好处 申报两化融合需要准备哪些材料
  19. 安卓手机怎么设置蓝牙耳机弹窗动画_链接重推其他团无线蓝牙耳机
  20. OmniPeek tools install and setting

热门文章

  1. 骁龙电竞先锋赛16强出炉,你我皆不凡
  2. 电子发票ofd文件如何转换成pdf格式
  3. 电分糊涂日记之《电路基本概念定律》
  4. 电脑爱好者必须懂得的电脑简单英语单词
  5. AD域禁止域用户使用本地账户登录
  6. 寻求Ebook下载地址
  7. ds 12.3 箱子里的木块
  8. HTML+CSS+JavaScript实现简单的日历效果
  9. CommandTimeout
  10. 三星Flash芯片驱动程序