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. [Android] 开发第七天

    在另一台机器上安装 Android-Studio ,结果卡在了 Gradle 的下载界面上,网上各种方案都试了一遍,最终解决办法是: 然后新建了一个 App ,创建了新的签名并上传到手机上,安装时直接 ...

  2. 怎么才知道你在使用的是不是中国电信CN2的线路

    原文:http://www.juzhenyun.org/helpview_66.html 首先你能从和电信的合同上确认是否为CN2线路 目前CN2的线路多为商业用途.公司用户申请中国电信的Intern ...

  3. zabbix触发器函数 count

    转摘至梅总文章 一直没用过这个函数,今天研究了下,确实很有用(用过的忽略): 之前很多功能都是用max,min,avg曲线实现的,其实用count最合理(如典典刚用的高防持续N次ping超时).   ...

  4. [转]MongoDB随笔2:使用查询

    转自:http://www.cnblogs.com/yangecnu/archive/2011/07/16/2108450.html 一.通过查询获取数据 在深入讨论查询之前,首先来了解一下查询返回的 ...

  5. MySQL 5.7 免安装版配置

      MySQL5.7免安装版配置 Mysql是一个比较流行且很好用的一款数据库软件,如下记录了我学习总结的mysql免安装版的配置经验. 一. 软件下载 5.7 32位https://dev.mysq ...

  6. OpenCL 图像卷积 2

    ▶ 上一篇图像卷积 http://www.cnblogs.com/cuancuancuanhao/p/8535569.html.这篇使用了 OpenCV 从文件读取彩色的 jpeg 图像,进行边缘检测 ...

  7. shell脚本学习指南-学习(2)

    1.I/O重定向符:<   >  >与管道   | #! /bin/bash echo -n "Enter your name!" //输出 printf &qu ...

  8. 0. ACM系列算法

    0.1 数学 0.1.1 概率 http://www.cnblogs.com/jiu0821/tag/%E6%A6%82%E7%8E%87/ 0.1.2 代数 0.1.2.1 Polya 0.1.2. ...

  9. 【BZOJ4154】Generating Synergy【kd树】

    题意 给定一棵以1为根的有根树,初始所有节点颜色为1,每次将距离节点a不超过l的a的子节点染成c,或询问点a的颜色 分析 我们以dfs序为横坐标,深度为纵坐标,建kd树.我们每次更新,都是在kd树中更 ...

  10. sqlserver流程控制(待续)

    if else: if(1=1) begin--必须1个=号print '111'--begin end 之间必须要有内容end else beginprint '222'end while: DEC ...