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数据查询的更多相关文章

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

    分页查询无处不在.使用Hibernate+jsp+HQL进行分页查询. 第一步:编写房屋实体类和House.hbm.xml映射. /* * 房屋实体类 */ public class House { ...

  2. HQL数据查询基础

    HQL定义 1.Hibernate Query Language, Hibernate查询语言 2.HQL是面向对象的查询语言(HQL查询的主体是映射配置的持久化类及其属性而SQL查询主体是数据库表) ...

  3. Hibernate之HQL检索(查询)方式

    HQL(Hibernate Query Language)是面向对象的查询语言,与SQL非常相似.在Hibernate中,HQL是使用最广泛的检索方式. 具有下面经常使用功能: (1)在查询语句中,能 ...

  4. hibernate hql 查询指定…

    以数组的形式抛出,前台页面就要把它当成一个数组来处理 以对象抛出,就要当成一个对象来处理. 在JSP页面使用标签时一定要注意这点. 版权声明:本文为博主原创文章,未经博主允许不得转载.

  5. hibernate框架学习之数据查询(HQL)

    lHibernate共提供5种查询方式 •OID数据查询方式 •HQL数据查询方式 •QBC数据查询方式 •本地SQL查询方式 •OGN数据查询方式 OID数据查询方式 l前提:已经获取到了对象的OI ...

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

    Hibernate共提供4种多表关联数据查询方式 OID数据查询+OGN数据查询方式 HQL数据查询方式 QBC数据查询方式 本地SQL查询方式(hibernate很少用) 1.OID数据查询+OGN ...

  7. hibernate框架学习第五天:数据查询、投影等

    复习day1环境搭建CRUD操作DB6个核心的APIday2TO PO DO 及其状态切换OID 自然主键 代理主键(uuid)一级缓存 Session绑定 load/get关系1对1 1对多(重点) ...

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

    一.批量处理操作 批量处理数据是指在一个事务场景中处理大量数据.在应用程序中难以避免进行批量操作,Hibernate提供了以下方式进行批量处理数据: (1)使用HQL进行批量操作     数据库层面 ...

  9. Hibernate批量处理数据、[HQL连接查询]

    一.批量处理操作 批量处理数据是指在一个事务场景中处理大量数据.在应用程序中难以避免进行批量操作,Hibernate提供了以下方式进行批量处理数据: (1)使用HQL进行批量操作 数据库层面 (2)使 ...

随机推荐

  1. Python链表与反链表

    # -*- coding:utf8 -*- #/usr/bin/env python class Node(object): def __init__(self, data, pnext = None ...

  2. [转]MVC 经验总结_序

    <appSettings> <add key="vs:EnableBrowserLink" value="false"/> </a ...

  3. 蚂蚁社招Java-第四轮电话面试【技术终面】

    作者:听着歌过面试链接:https://www.nowcoder.com/discuss/64708来源:牛客网 蚂蚁社招Java-第四轮电话面试[技术终面] 转载   (耗时22分钟,其实聊得东西挺 ...

  4. 像素(PX)转其它长度单位(mm、cm...)

    今天想把px转成mm为单位,因像素跟其它单位比值的大小会跟屏幕设置的分辨率大小而不定,因此不能以固定的数值去计算. 解决方法是 页面上放一个高度为1mm的隐藏块 <div id="di ...

  5. struts2配置默认首页

    配置struts2 默认欢迎页的几种办法: 1.首先需要明确的是struts过滤器配置映射的模式是路径匹配还是扩展匹配,如果url-pattern配置为/*,如果不做特殊处理,是不会转到welcome ...

  6. Python编程快速上手(七)Unsplash批量下载器

    首发于个人博客:http://rhinoc.top/post/python_7.html 程序描述 V1.0输入关键字搜索图片,模拟页面下拉获取更多图片,页面加载完成后获取图片链接并下载至指定文件夹. ...

  7. c语言寄存器变量

    寄存器存在于CPU内部,运算速度非常快, 因为内存中的数据必须载入寄存器才能计算.如果直接定义一个变量为寄存器变量,则少了载入等过程自然会快.对于频繁使用的变量可以把它放在寄存器中来提速度. 对于VC ...

  8. SQLSERVER的四个系统数据库

    (1)Master数据库是SQL Server系统最重要的数据库,它记录了SQL Server系统的所有系统信息.这些系统信息包括所有的登录信息.系统设置信息.SQL Server的初始化信息和其他系 ...

  9. eigen安装

    https://blog.csdn.net/liuxiaoheng1992/article/details/54410148

  10. [Selenium] 怎样判断是否适合自动化测试

    实施自动化测试前需要对软件开发过程进行分析,以观察其是否适合使用自动化测试.通常需要满足以下条件: 1)需求变动不频繁 2)项目周期足够长 3)自动化测试脚本可重复使用 4)手工测试无法完成或者需要大 ...