HQL是Hibernate Query Language的缩写,HQL的语法很像SQL的语法,但HQL是一种面向对象的查询语言。因此,SQL的操作对象是数据表和列等数据对象,而HQL的操作对象是类、实例、属性等。

HQL是完全面向对象的查询语言,因此可以支持继承和多态等特征

HQL查询的步骤:

1,获取 Hibernate Session 对象。
2,编写HQL语句。
3,以HQL为参数,调用Session的createQuery创建查询对象(如果HQL语句有参数,调用Query的set方法赋值)。
4,调用Query对象的list等方法返回实例。
如:

 <span style="font-size:24px;">  LearningDAO learningDao=new LearningDAO();Configuration cfg=new Configuration().configure();SessionFactory sessionFactory=learningDao.getSessionFactory();Session session=sessionFactory.openSession();//获得session对象Transaction tran=session.beginTransaction();Query query=session.createQuery("from Learning");//HQL语句,创建Query对象List list=query.list();for(int i=0;i<list.size();i++){Learning l=(Learning)list.get(i);System.out.println(l.getId());}
</span>

HQL语句的常用语法:

HQL语句本身是不区分大小写的。也就是说,HQL语句的关键字和函数都是不区分大小写的。但HQL语句中所使用的包名、类名、实例名和属性名都区分大小写

1,HQL查询的from子句

from子句是最简单的HQL语句,也是最基本的HQL语句。from关键字后紧跟持久化类的类名,

例如:

from City  ;表明从City持久化类中选出全部的实例。
大部分时候,推荐为该City的每个实例起别名。

例如:
from City as c

在上面的HQL语句中,City持久化类中的实例的别名为c,既然 c是实例名,因此也应该遵守Java的命名规则:第一个单词的首字母小写,后面每个单词的首字母大写。

命名别名时,as关键字是可选的,但为了增加可读性,建议保留。

例如:
from City  c
from后还可同时出现多个持久化类,此时将产生一个笛卡儿积或跨表的连接。

2,HQL查询的select子句:

select 子句选择将哪些对象与属性返 回到查询结果集中.select子句用于确定选择出的属性,当然select选择的属性必须是from后持久化类包含的属性

select可以选择任意属性,不仅可以选择持久化类的直接属性,还可以选择组件属性包含的属性,

例如:

<span style="font-size:24px;">select p.name.firstName from Person as p</span>

select也支持将选择出的属性存入一个List对象中,例如:

<span style="font-size:24px;">select new list(p.name , p.address) from Person as p</span>

甚至可以将选择出的属性直接封装成对象,例如:

<span style="font-size:24px;">select new ClassTest(p.name , p.address) from Person as p</span>

前提是ClassTest支持p.name和p.address的构造器,假如p.name的数据类型是 String,p.address的数据类型是String,则ClassTest必须有如下的构造器:
ClassTest(String s1, String s2)

select还支持给选中的表达式命名别名,例如:

<span style="font-size:24px;">select p.name as personName from Person as p</span>

这种用法与new map结合使用更普遍。如:

<span style="font-size:24px;">select new map(p.name as personName) from Person as p</span>

在这种情形下,选择出的是Map结构,以personName为key,实际选出的值作为value。

3,HQL查询的聚集函数

HQL查询甚至可以返回作用于属性之上的聚集函数的计算结果:

select avg(cat.weight), sum(cat.weight), max(cat.weight), count(cat)
from Cat cat

● avg,计算属性平均值。
● count,统计选择对象的数量。
● max,统计属性值的最大值
● min,统计属性值的最小值。
● sum,计算属性值的总和。

4,多态查询

HQL语句被设计成能理解多态查询,from后跟的持久化类名,不仅会查询出该持久化类的全部实例,还会查询出该类的子类的全部实例

下面的查询语句:

from Person as p

该查询语句 不仅会查询出Person的全部实例,还会查询出Person的子类,如Teacher的全部实例, 前提是Person和Teacher完成了正确的继承映射。

5,HQL查询的where子句

where子句允许你将返回的实例列表的范围缩小. 如果没有指定别名,你可以使用属性名来直接引用属性:
from Cat where name='Fritz'
如果指派了别名,需要使用完整的属性名:
from Cat as cat where cat.name='Fritz'
返回名为(属性name等于)'Fritz'的Cat类的实例。

复合属性表达式加强了where子句的功能,例如如下HQL语句:
from Cat cat where cat.mate.name like "kit%"
该查询将被翻译成为一个含有内连接的SQL查询,翻译后的SQL语句如下:

select * from cat_table as table1 cat_table as table2 where table1.mate =
table2.id and table1.name like "kit%"

再看下面的HQL查询语句:

from Foo foo where foo.bar.baz.customer.address.city like"guangzhou%"

翻译成SQL查询语句,将变成一个四表连接的查询。
=运算符不仅可以被用来比较属性的值,也可以用来比较实例:

from Cat cat, Cat rival where cat.mate = rival.mate
select cat, mate
from Cat cat, Cat mate
where cat.mate = mate

where子句中的表达式:
● 数学运算符+、–、*、/?等。
● 二进制比较运算符=、>=、<=、<>、!=、like等。
● 逻辑运算符and、or、not等。

● in、not in、between、is null、is not null、is empty、is not empty、member of和not member of等。
● 简单的case、case ... when ... then ... else ... end和case、case when ... then ... else ... end等。

● 字符串连接符value1 || value2或使用字符串连接函数concat(value1 , value2)。
● 时间操作函数current_date()、current_time()、current_timestamp()、second()、minute()、hour()、day()、month()、year()等。
● HQL还支持EJB-QL 3.0所支持的函数或操作substring()、trim()、lower()、upper()、length()、locate()、abs()、sqrt()、bit_length()、coalesce()和nullif()等。
● 还支持数据库的类型转换函数,如cast(... as ...),第二个参数是Hibernate的类型名,或者extract(... from ...),前提是底层数据库支持ANSI cast()?和extract()。
● 如果底层数据库支持如下单行函数sign()、trunc()、rtrim()、sin()。则HQL语句也完全可以支持。

● HQL语句支持使用?作为参数占位符,这与JDBC的参数占位符一致,也可使用命名参数占位符号,方法是在参数名前加冒号 :,例如 :start_date和:x1等。
● 当然,也可在where子句中使用SQL常量,例如'foo'、69、'1970-01-01 10:00: 01.0'等。
● 还可以在HQL语句中使用Java public static final 类型的常量,例如eg.Color.TABBY。
除此之外,where子句还支持如下的特殊关键字用法。

● in与between...and可按如下方法使用:

from DomesticCat cat where cat.name between 'A' and 'B'
from DomesticCat cat where cat.name in ( 'Foo','Bar','Baz')

● 当然,也支持not in和not between...and的使用,例如:

from DomesticCat cat where cat.name not between 'A' and 'B'
from DomesticCat cat where cat.name not in ( 'Foo','Bar','Baz' )

● 子句is null与is not null可以被用来测试空值,例如:

from DomesticCat cat where cat.name is null;
from Person as p where p.address is not null;

如果在Hibernate配置文件中进行如下声明:

<property name="hibernate.query.substitutions">true 1, false 0</property>

上面的声明表明,HQL转换SQL语句时,将使用字符1和0来取代关键字true和false。然后将可以在表达式中使用布尔表达式,例如:
from Cat cat where cat.alive = true

● size关键字用于返回一个集合的大小,例如:

from Cat cat where cat.kittens.size > 0
from Cat cat where size(cat.kittens) > 0

● 对于有序集合,还可使用minindex与maxindex函数代表最小与最大的索引序数。同理,可以使用minelement与maxelement函数代表集合中最小与最大的元素。 例如:

from Calendar cal where maxelement(cal.holidays) > current date
from Order order where maxindex(order.items) > 100
from Order order where minelement(order.items) > 10000

● 可以使用SQL函数any、some、all、exists、in操作集合里的元素,例如:

//操作集合元素
select mother from Cat as mother, Cat as kit
where kit in elements(foo.kittens)
//p的name属性等于集合中某个元素的name属性
select p from NameList list, Person p
where p.name = some elements(list.names)
//操作集合元素
from Cat cat where exists elements(cat.kittens)
from Player p where 3 > all elements(p.scores)
from Show show where 'fizard' in indices(show.acts)

注意这些结构变量size、elements、indices、minindex、maxindex、minelement、maxelement 等,只能在where子句中使用。

● where子句中,有序集合的元素(arrays, lists, maps)可以通过[ ]运算符访问。例如:

//items是有序集合属性,items[0]代表第一个元素
from Order order where order.items[0].id = 1234//holidays是map集合属性,holidays[national day]代表其中一个元素
select person from Person person, Calendar calendar
where calendar.holidays['national day'] = person.birthDay
and person.nationality.calendar = calendar//下面同时使用list 集合和map集合属性
select item from Item item, Order order
where order.items[ order.deliveredItemIndices[0] ] = item and order.id = 11
select item from Item item, Order order
where order.items[ maxindex(order.items) ] = item and order.id = 11

6. order by子句

查询返回的列表(list)可以根据类或组件属性的任何属性进行排序,例如:

from Person as p  order by p.name, p.age

还可使用 asc或desc关键字指定升序或降序的排序规则,例如:

from Person as p  order by p.name asc , p.age desc

如果没有指定排序规则,默认采用升序规则。即是否使用asc关键字是没有区别的,加asc是升序排序,不加asc也是升序排序。

7,group by子句

返回聚集值的查询可以对持久化类或组件属性的属性进行分组,分组所使用的group by子句。看下面的HQL查询语句:

select cat.color, sum(cat.weight), count(cat) from Cat cat  group by cat.color

having子句用于对分组进行过滤,如下:

select cat.color, sum(cat.weight), count(cat)  from Cat cat
group by cat.color   having cat.color in (eg.Color.TABBY, eg.Color.BLACK)

注意: having子句用于对分组进行过滤,因此having子句只能在有group by子句时才可以使用,没有group by子句,不能使用having子句

hibernate的HQL查询语言总结相关推荐

  1. Hibernate 笔记 HQL查询

    http://www.cnblogs.com/zilong882008/archive/2011/11/05/2237123.html Hibernate 笔记 HQL查询(一)单属性,多属性查询 H ...

  2. Hibernate中HQL函数汇总及其说明

    2019独角兽企业重金招聘Python工程师标准>>> Criteria查询对查询条件进行了面向对象封装,符合编程人员的思维方式,不过HQL(Hibernate Query Lang ...

  3. Hibernate的HQL中in参数设置和JdbcTemplete中的in参数

    写代码的时候突然忘记了,在此记录一下: Hibernate的HQL中in参数设置 public void updateDeviceByIDS(Long[] devicepkarr, DeviceINF ...

  4. java hql多条件查询_JSP 开发之hibernate的hql查询多对多查询

    JSP 开发之hibernate的hql查询多对多查询 在hibernate的hql查询中,假如说分组信息与试题是多对多关系,那么我们要在hql查询中对含有多个分组信息的试题都要查询出来.并同时查询出 ...

  5. 391、Java框架46 -【Hibernate - 查询HQL、查询Criteria、查询标准SQL】 2020.10.19

    0.目录 1.HQL 2.使用HQL,根据name进行模糊查询 3.查询Criteria 4.使用Criteria,根据name进行模糊查询 5.查询-标准SQL 6.使用标准SQL,根据name进行 ...

  6. 什么事java中hql语句,hibernate中hql语句详解

    之前给大家讲了一下hibernate分页查询的内容,那么下面就要接着给大家对hibernate中hql语句方面的知识进行一下详细的讲解,一起来了解一下吧. 刚开始做项目的时候,项目当中的hql语句就是 ...

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

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

  8. java hql 查询所有内容,HQL查询语言转载

    上一章介绍了Hibernate的关联映射,在11章的例子中接触到了Hibernate的添加.查询和删除的操作.这一章将介绍Hibernate.Hibernate查询语言为HQL(Hibernate Q ...

  9. Hibernate之HQL

    目录 1.什么是hql 2.hql和sql区别/异同 3.案例 1.什么是hql HQL是Hibernate Query Language的缩写 2.hql和sql区别/异同 HQL SQL 类名/属 ...

最新文章

  1. python3 多进程 multiprocessing 报错 AttributeError: ‘ForkAwareLocal‘ object has no attribute ‘connection‘
  2. android的33种常用组件1
  3. java jxl map,jxl操作Excel
  4. python(numpy,pandas11)——pandas merge根据索引合并数据
  5. Mac OS使用技巧之十三:Finder中标记的使用
  6. 宅家过年 | 程序员消遣活动指南
  7. php.ini-development和php.ini-production的区别
  8. 2019年用于自动化的5个最佳Java测试框架
  9. UNIX(多线程):01---线程简介及线程限制
  10. JDK源码包结构分类
  11. Java 删除集合中指定的元素
  12. 九九乘法表Python+Java
  13. 量化交易很好,但是也存在问题
  14. IT部领导总结:不想被淘汰,看看快速做报表的技巧,甚至能养老
  15. Deeping Learning学习与感悟——《深度学习工程师》_2
  16. google内部考核制度OKR
  17. 【机器学习】左逆、右逆、伪逆和广义逆的概念理解
  18. python圣诞节祝福_Pyhton表白代码——浪漫圣诞节
  19. 检测OTU序列遗传发育信号的R实现
  20. 【Markdown】编辑器使用技巧大汇总4。集合运算符的表示($\in$ 等),箭头符号的表示($\uparrow$ 等),使用指定的字体,转义字符的输入

热门文章

  1. STM32之CAN---工作/测试模式浅析
  2. 宏EXPORT_SYMBOL在内核中的作用
  3. c++新特性11 (6) =default
  4. C++ Primer 5th笔记(chap 18 大型程序工具) 类、 命名空间与作用域
  5. 近世代数--循环群--怎么判断是不是循环群?
  6. 【python】数据结构与算法之二分查找
  7. 2021-07-09
  8. Django Models 多条件查询 以及Q/F查询
  9. 逆向分析使用COM组件对象模型的代码
  10. 静态链接库编写与使用(VC6)