Hibernate 之HQL数据查询
1. HQL简介
HQL是面向对象的查询语言,与SQL查询语言相比,虽然在语法上类似,都是运行时进行解析,但HQL并不像SQL那样操作的是数据表,列等数据库对象,HQL所操作的对象是类,对象,属性等。它也可以支持继承和多态等特征,在Hibernate 提供的各种检索方式中,HQL是使用最广泛的。
2. Query接口
Hibernate框架负责解析HQL语句,根据映射配置信息,把HQL查询语句解析成相应的SQL语句来执行数据库的查询操作。这一过程依赖的就是Query接口。Query的实例由Session的createQuery()方法创建,方法中包含一个HQL语句参数。Query接口的list()方法执行HQL查询,list()方法返回结果为List集合,集合中存放符合查询条件的持久化对象。
3.检索对象——from子句
将两个实体Commodity(商品)和Seller(商家)设置单向多对一关系,两者都有相应的数据。用JUnit进行测试。
3.1 输出商品名称和所属商家的名称

控制台输出:

可以看到,第一条语句是查询商品表获得所有的商品信息,并输出第一件商品名称。接着第二条语句,根据外键信息,查询商家表获得商品对应商家名称。接着输出下一件商品名称,注意,因为这件商品对应的商家信息也是A服装店,已经做过相应的查询,这时就不再做新的查询,而直接使用已有查询结果A服装店。当下面遇到新的商家信息(B数码店)还没查询,同样根据外键信息来查询商家表。
这样的查询过程,是因为有一个默认的懒加载状态,Hibernate 默认是不查询相应的外键信息所对应的数据,当需要的时候,才根据具体的需要做一个临时查询。这样的设置也是为了提高查询的效率和性能。
3.2 from子句中持久化类的引用
在前面编写的HQL语句中用了 from Commodity ,它的全限定名为 hbb.Commodity,但我们只需要用他的类名即可。在Java中规定使用类时,一定要指定全限定名,这样java环境才知道去哪获取这个类。而HQL语句中之所以可以省略是因为 auto-import(自动引入)缺省情况。在解析HQL语句的时候,会根据映射配置信息自动完成持久化类的导入。当然,在from子句中要使用全限定名也可以。
4. 选择——select子句
4.1 通过Object[]返回查询结果
select子句中未指定返回数据类型,默认为Object[]。

成功执行。如果只查询一个属性,依然用Object[]的话,就会报错,如果只有一个属性时,list()方法就会返回对象,而不是对象数组,这时需要进行一定调整。

同样可以直接写作 List list = query.list();
4.2 通过List返回查询结果

4.3 通过Map返回查询结果
注意get获取的key值,是字符串类型所以需要加""。如果属性用了别名,可以把序号改为别名。

5. 通过自定义类型返回查询结果
首先需要在持久化类中定义对应的构造器,构造器的参数就是我们要返回的属性信息。然后在select子句中调用定义的构造器。以自定义类型返回查询结果。

测试类中:

注意:当添加了自定义构造器后,在实体类中还需要添加无参构造器,因为在HQL语句中,当指定了查询目标(如Seller),Hibernate会调用指定构造器(如new Seller())来封装,但是如果没有指定构造器,Hibernate便会调用持久化类中默认的构造器,如前面Hql语句“from Seller”就没有指定构造器,所以要一个无参构造器来完成相应对象的创建。所以当增加了自定义构造器后,添加无参构造器。
6. Orderby子句
首先对商家的id进行升序排序,如果id相同情况下按照价格做降序排列,如果还一样则升序排列。

7. 总结
HQL语句大小写敏感,特别是持久化类及其属性的大小写。在我们自定义了构造器之后,一定要增加默认构造器。如果你觉得对你有点用的话,请点赞或关注我,谢谢观看。
Hibernate 之HQL数据查询的更多相关文章
- Java_Web三大框架之Hibernate+jsp+HQL分页查询
分页查询无处不在.使用Hibernate+jsp+HQL进行分页查询. 第一步:编写房屋实体类和House.hbm.xml映射. /* * 房屋实体类 */ public class House { ...
- HQL数据查询基础
HQL定义 1.Hibernate Query Language, Hibernate查询语言 2.HQL是面向对象的查询语言(HQL查询的主体是映射配置的持久化类及其属性而SQL查询主体是数据库表) ...
- Hibernate之HQL检索(查询)方式
HQL(Hibernate Query Language)是面向对象的查询语言,与SQL非常相似.在Hibernate中,HQL是使用最广泛的检索方式. 具有下面经常使用功能: (1)在查询语句中,能 ...
- hibernate hql 查询指定…
以数组的形式抛出,前台页面就要把它当成一个数组来处理 以对象抛出,就要当成一个对象来处理. 在JSP页面使用标签时一定要注意这点. 版权声明:本文为博主原创文章,未经博主允许不得转载.
- hibernate框架学习之数据查询(HQL)
lHibernate共提供5种查询方式 •OID数据查询方式 •HQL数据查询方式 •QBC数据查询方式 •本地SQL查询方式 •OGN数据查询方式 OID数据查询方式 l前提:已经获取到了对象的OI ...
- hibernate的基础学习--多表关联数据查询
Hibernate共提供4种多表关联数据查询方式 OID数据查询+OGN数据查询方式 HQL数据查询方式 QBC数据查询方式 本地SQL查询方式(hibernate很少用) 1.OID数据查询+OGN ...
- hibernate框架学习第五天:数据查询、投影等
复习day1环境搭建CRUD操作DB6个核心的APIday2TO PO DO 及其状态切换OID 自然主键 代理主键(uuid)一级缓存 Session绑定 load/get关系1对1 1对多(重点) ...
- Hibernate批量处理数据、HQL连接查询
一.批量处理操作 批量处理数据是指在一个事务场景中处理大量数据.在应用程序中难以避免进行批量操作,Hibernate提供了以下方式进行批量处理数据: (1)使用HQL进行批量操作 数据库层面 ...
- Hibernate批量处理数据、[HQL连接查询]
一.批量处理操作 批量处理数据是指在一个事务场景中处理大量数据.在应用程序中难以避免进行批量操作,Hibernate提供了以下方式进行批量处理数据: (1)使用HQL进行批量操作 数据库层面 (2)使 ...
随机推荐
- [转]命令行在IIS添加虚拟目录
来自:http://www.jb51.net/softjc/29702.htmlMkwebdir -c LocalHost -w "Default Web Site" –v Com ...
- TCL数组
数组是一组使用索引对应元素的排列方式.常规数组的语法如下所示. set ArrayName(Index) value 用于创建简单数组的例子,如下所示. #!/usr/bin/tclsh set la ...
- 关系型数据库与Key-value型数据库Mongodb模式设计对比
MongoDb 相比于传统的 SQL 关系型数据库,最大的不同在于它们的模式设计( Schema Design )上的差别,正是由于这一层次的差别衍生出其它各方面的不同. 我们可以简单的认为关系型数据 ...
- CB XE7 C11 64位编译器 成员变量初始化
看到了C++11,看到了XE7的64位,想实现下面方便的类成员初始化,失望. 一.64位用法 clang3,64位编译器,不支持中文变量名,编写代码提示没有32位快,风格简单不用写单独的赋值语句函数, ...
- Nginx 实现 IP+项目名 访问
参考: https://blog.csdn.net/csdn1152789046/article/details/51362735 修改前 项目放在Tomcat的webapps/ROOT/ 目录下面 ...
- [X264] MinGW编译x264,VC中调用libx264.dll-------------<参考转>
1. 下载并按照MinGW,最好就缺省按照 http://sourceforge.net/projects/ ... ler/mingw-get-inst/ 把C:\MinGW\bin添加 ...
- 实现HBase增量入库(HBase删除自定义时间戳行数据)
目录 1. 背景描述 2. 问题描述 3. 解决方案 1. 背景描述 目前在做音乐推荐项目,前期做排序模型优化,任务是使用模型对用户的历史音乐进行排序,有6800多万个用户,约40G的用户数据,使用H ...
- rook issues
ceph-volumeattacher: failed rbd single_major check, assuming it's unsupported: failed to check for r ...
- mysql5.7 初始化启动
root@0f6852dfee81:/# mysql --versionmysql Ver 14.14 Distrib 5.7.18-16, for debian-linux-gnu (x86_64 ...
- set 续3
-------siwuxie095 set 技巧高级篇: 1.利用 set /a 进行赋值 在开启变量延迟情况下,要判断数组 S!n! 的值的情况, 不 ...