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语句大小写敏感,特别是持久化类及其属性的大小写。在我们自定义了构造器之后,一定要增加默认构造器。如果你觉得对你有点用的话,请点赞或关注我,谢谢观看。

时间: 2024-10-05 12:33:22

Hibernate 之HQL数据查询的相关文章

HQL数据查询基础(一)

源自 imooc 的学习 什么是HQL呢? HQL 是Hibernate Query Language,Hibernate查询语言:同时HQL是一种面向对象的查询语言,HQL查询的主体是映射配置的持久化类及其属性.而SQL查询的主体是数据库表,它们两者查询主体是完全不同的.SQL能实现的查询功能,HQL几乎同样也都能实现.实际上Hibernate框架会解析HQL语句,并将HQL语句转化为SQL语句,来完成数据库的操作. HQL提供了丰富灵活的查询特性,是Hibernate官方推荐的查询方式. H

Java_Web三大框架之Hibernate+jsp+HQL分页查询

分页查询无处不在.使用Hibernate+jsp+HQL进行分页查询. 第一步:编写房屋实体类和House.hbm.xml映射. /* * 房屋实体类 */ public class House { private int id;//房屋id private HouseType type;//房屋类型 private Users2 user;//用户 private Street street;//街道 private String title;//标题 private String descr

Hibernate中Hql的查询

一 . Hibernate 查询语言(HQL)是一种面向对象的查询语言,类似于 SQL,但不是去对表和列进行操作,而是面向对象和它们的属性. HQL 查询被 Hibernate 翻译为传统的 SQL 查询从而对数据库进行操作. 1.简单的查询操作案例: 1.1定义hibernate的主配置文件hibernate.cfg.xml <?xml version='1.0' encoding='UTF-8'?> <!DOCTYPE hibernate-configuration PUBLIC &

Hibernate之HQL检索(查询)方式

HQL(Hibernate Query Language)是面向对象的查询语言,与SQL非常相似.在Hibernate中,HQL是使用最广泛的检索方式. 具有下面经常使用功能: (1)在查询语句中,能够设定各种条件 (2)支持检出对象的部分属性,就是SQL语句中不用*,而是查询我们想查询的对象 (3)支持连接查询 (4)支持分页查询 (5)支持子查询 (6)支持动态绑定參数 (7)支持分组查询,能够用having,group by (8)提供分组函数(内置聚集函数,sum(),count(),a

hibernate的基础学习--多表关联数据查询

Hibernate共提供4种多表关联数据查询方式 OID数据查询+OGN数据查询方式 HQL数据查询方式 QBC数据查询方式 本地SQL查询方式(hibernate很少用) 1.OID数据查询+OGN数据查询方式 1 public class TestOID_OGN { 2 3 /** 4 * 什么时候时候什么时候发送 5 */ 6 @Test 7 public void findUser() { 8 SessionFactory sf = H3Util.getSessionFactory();

Hibernate批量处理数据、HQL连接查询

一.批量处理操作 批量处理数据是指在一个事务场景中处理大量数据.在应用程序中难以避免进行批量操作,Hibernate提供了以下方式进行批量处理数据: (1)使用HQL进行批量操作     数据库层面 (2)使用JDBC API进行批量操作  数据库层面 (3)使用Session进行批量操作   会进缓存 1.使用HQL进行批量操作 HQL可以查询数据,也可以批量插入.更新和删除数据.HQL批量操作实际上直接在数据库中完成,处理的数据不需要加载到Session缓存中.使用Query接口的execu

Hibernate数据查询(转)

Hibernate Query Language(HQL)Criteria QueryNative SQL下面对其分别进行解释Hibernate Query Language:HQL提供了是十分强大的功能,它是针对持久化对象,用取得对象,而不进行update,delete和insert等操作.而且HQL是面向对象的,具备继承,多态和关联等特性.from子句:from子句是最简单的HQL,例如from Student,也可以写成 select s from Student s.它简单的返回Stud

hibernate学习系列-----(4)hibernate基本查询上篇:HQL基本查询

紧接着上一篇,今天继续hibernate的学习总结,来聊一聊hibernate的基本查询方法,先说说HQL(hibernate Query Language):它是官方推荐的查询语言.在开始写代码之前,看看需要做哪些准备工作吧,首先,在我们的学生类中新增一个属性"clazz",其实不加也可以,接着,我们需要重写Student.java类中的toString()方法,代码如下: /** * 重写toString方法 */ @Override public String toString(

Hibernate(十一)HQL查询

HQL:Hibernate Query Language HQL有几个特点: 与SQL相似,SQL中的语法基本上都可以直接使用; SQL查询的是表和表中的列:HQL查询的是对象与对象中的属性; HQL的关键字不区分大小写,类名与属性名区分大小写; select可以省略. package test.hibernate.hbmHQL; import java.util.HashSet; import java.util.Set; public class Department { private I