当前位置: 首页 > news >正文

Hibernate执行原生SQL返回ListMap类型结果集

本文转载自:https://www.cnblogs.com/apem/p/3502039.html

我是学java出身的,web是我主要一块;

在做项目的时候最让人别扭的就是hibernate查询大都是查询出List<T>(T指代对应实体类)类型

如果这时候我用的联合查询,那么返回都就是List<Object[]> , 这样的结果集让我苦恼了很久,

于是我萌发了使用spring提供的JdbcTemlate来 查询出 List<Map<String,Object>>的念头,

方法虽然可行,可惜的是spring偌大一个框架,居然不提供jdbc分页。。。。

无奈之下我又重新回归hibernate,找了很久,终于发现hibernate原来是可以查询出List<Map<String,Object>>类型的结果集

 

 

1.2、query.setResultTransformer(Transformers.ALIAS_TO_ENTITY_MAP);

Query 和 SQLQuery都可以使用别名,将查询出来的记录转化成为map

SQLQuery执行出来是{name1: value1, name2: value2}

但是Query 例如语句: select o.name1, o.name2 from Object o

执行出来的却不是想象中的那样而且{0:value1, 1: value2}

import org.hibernate.criterion.CriteriaSpecification;
import org.hibernate.transform.ResultTransformer;
import org.hibernate.Session;
import org.hibernate.Query;

最近在学习hibernate
以下代码功能:Hibernate执行原生SQL返回List类型结果集//获得session对象
  Session session = super.getSession();
  //创建sql语句
  String sql = "SELECT users.name,usersinfo.* FROM users,usersinfo WHERE users.id = usersinfo.userid";
  //获得SQLQuery对象
  SQLQuery query = session.createSQLQuery(sql);
  //设定结果结果集中的每个对象为Map类型   
  query.setResultTransformer(CriteriaSpecification.ALIAS_TO_ENTITY_MAP);
  //执行查询
  List list = query.list();
  //释放session
  releaseSession(session);
在使用hibernate进行查询时,使用得最多的还是通过构建hql进行查询了。在查询的过程当中,除使用经常的查询对象方法之外,还会遇到查询一个属性,或一组聚集结果的情况。在这种情况下,我们通常就需要对返回的结构进行处理。
一般情况下,我们通过构建hql,并通过设置query的resultTransformer来定制返回结果的类型,一般设置为map属性,如下所示:
Query query = session.createQuery("hql");?
query.setResultTransformer(CriteriaSpecification.ALIAS_TO_ENTITY_MAP);
来指定查询结果的每一项为一个map。
不过,随着hibernate的发展,可以在hql中直接使用集合查询语句,如list和map了。以下分别介绍使用List和Map时的查询语句以及查询结果。首先,数据库的数据如下所示:
mysql> select * from p_dictionary;
+-----------------+----+---------+------+--------+--------+
| dictionary_type | id | version | code | forbid | value |
+-----------------+----+---------+------+--------+--------+
| COUNTY | 1 | 0 | 001 | | 四川 |
| COUNTY | 2 | 0 | 002 | | 北京 |
| COUNTY | 3 | 0 | 001 | NULL | 四川 |
+-----------------+----+---------+------+--------+--------+
3 rows in set (0.00 sec)
以下分别介绍使用list和map的查询语句和查询结果:
使用List

String query = "select new List(p.code, p.value) from Dictionary p";

List list = session.createQuery(query).list();

System.out.println(list);

//结果: [[001, 四川],[002,北京],[001,四川]]

?
使用Map,首先不指定alias,则结果的键就按照查询出来的顺序结果,使用0,1来表示key
String query = "select new Map(p.code, p.value) from Dictionary p";

List list = session.createQuery(query).list();

//结果:[{1=四川, 0=001},{1=北京, 0=002},{1=四川, 0=001}]

?
使用Map,指定alias,则结果中的key则为alias
String query = "select new Map(p.code as code, p.value as value) from Dictionary p";

List list = session.createQuery(query).list();

//结果:[{value=四川, code=001},{value=北京, code=002},{value=四川, code=001}]

?
如果部分使用alias,部分不使用,则使用了alias的将使用alias作为key,没有使用的则仍然使用序号代替,其中序号则为在查询结果的序号
String query = "select new Map(p.code as code, p.value) from Dictionary p";

List list = session.createQuery(query).list();

//结果:[{1=四川, code=001},{1=北京, code=002},{1=四川, code=001}]

--------------------------------------------------------------------------------------------------
select new List(p.name, p.address) from Person as p ;
select将选择出来的属性存入一个List对象中

select new ClassTest(p.name, p.address) from Person as p;
select将选择出来的属性封装成对象,前提是ClassTest支持p.name, p.address的构造函数,

select new Map(p.name as personName) from Person as p ;
select将选中的表达式命名为别名,这种用法与new Map()结合,选择出来的是Map结构,
以personName为key,将实际选择出来的值作为value

 

转载于:https://www.cnblogs.com/wpcnblog/p/8184768.html

相关文章:

  • Android编译过程详解(一)
  • 【bootstrap】modal模态框的几种打开方法+问题集锦
  • denyhost防止SSH暴力破解
  • [国家集训队2012]middle
  • Design Pattern: Prototype 模式
  • Linux环境下shell和vim中乱码原因及消除办法
  • 利用Docker轻松玩转Cassandra
  • 搭建高可用mongodb集群(三)—— 深入副本集内部机制
  • 【算法专题】卡特兰数(计数数列)
  • 51cto任意密码修改(失效了)
  • Wannafly挑战赛7 C - 小Q与氪金游戏
  • [c#基础]DataTable的Select方法
  • Hibernate 缓存
  • ESXi 5.0 环境下安装部署Cisco Nexus 1000v
  • Python之内置函数
  • (三)从jvm层面了解线程的启动和停止
  • 11111111
  • es的写入过程
  • Flex布局到底解决了什么问题
  • Git初体验
  • Java 9 被无情抛弃,Java 8 直接升级到 Java 10!!
  • JavaScript对象详解
  • laravel with 查询列表限制条数
  • Linux Process Manage
  • mongo索引构建
  • Mysql5.6主从复制
  • PhantomJS 安装
  • SpringBoot几种定时任务的实现方式
  • TCP拥塞控制
  • web标准化(下)
  • 从输入URL到页面加载发生了什么
  • 构建工具 - 收藏集 - 掘金
  • 湖南卫视:中国白领因网络偷菜成当代最寂寞的人?
  • 一个JAVA程序员成长之路分享
  • 怎么把视频里的音乐提取出来
  • LevelDB 入门 —— 全面了解 LevelDB 的功能特性
  • ​MPV,汽车产品里一个特殊品类的进化过程
  • !!【OpenCV学习】计算两幅图像的重叠区域
  • "无招胜有招"nbsp;史上最全的互…
  • #我与Java虚拟机的故事#连载03:面试过的百度,滴滴,快手都问了这些问题
  • (4)STL算法之比较
  • (Matalb回归预测)PSO-BP粒子群算法优化BP神经网络的多维回归预测
  • (Ruby)Ubuntu12.04安装Rails环境
  • (附源码)springboot青少年公共卫生教育平台 毕业设计 643214
  • (附源码)计算机毕业设计SSM基于java的云顶博客系统
  • (六)c52学习之旅-独立按键
  • (一)C语言之入门:使用Visual Studio Community 2022运行hello world
  • (转)3D模板阴影原理
  • .dat文件写入byte类型数组_用Python从Abaqus导出txt、dat数据
  • .net6使用Sejil可视化日志
  • .NET实现之(自动更新)
  • .net通用权限框架B/S (三)--MODEL层(2)
  • .Net下的签名与混淆
  • @RequestMapping处理请求异常
  • [ vulhub漏洞复现篇 ] Apache APISIX 默认密钥漏洞 CVE-2020-13945