HQL:Hibernate Query Language,是Hibernate框架中的查询语言,十分接近于SQL语言!以下介绍一些常用的Hql语句:

Classes类:


Student类:


初始化数据类:


二、常用的hql语句

2.1,简单属性查询

单一属性:

多个属性:

多个属性查询,返回实体对象


2.2,带参数的查询

拼串查询

使用?方式传递参数,索引从0开始,值能使用单引号引起来


使用 :参数名的方式传递参数

2.3,对象导航查询(通过cross join查询,慎重考虑使用)

2.4,外置命名查询

实体映射文件中的配置:

查询时的调用:

2.5,分页查询

setFirstResult:表示第一条记录的索引;setMaxResults:表示每页显示的最大记录数

2.6,原生sql语句查询

2.7,统计查询(实际上是调用函数的查询)

2.8,过滤查询

实体对象映射文件配置:





以上就是一些常用的hql语句,下面介绍一下Hibernate中的N+1问题

三、N+1问题

所谓的N+1问题实际上是指Hibernate在查询的时候,发出了N+1条sql语句:

1:发出一条查询id列表的语句

N:根据id发出N条sql语句,加载相关对象

Iterator接收查询结果:



控制台打印结果:

【Hibernate 6】常用的hql语句以及N+1问题


解决方案:

每次执行list操作后会将数据放到session的缓存中(一级缓存),所以采用iterate的时候, 首先会发出一条查询id列表的语句,再根据id到缓存中加载相应的数据,如果缓存中存在与之匹配的数据,则不再发出根据id查询的sql语句,直接使用缓存中的数据。

所以,使用list去接收查询的语句,可避免N+1的问题。但如果缓存中存在数据,使用Iterate会比使用List性能高!

注意: 在默认情况下,每次执行list查询实体对象都会发出查询语句,除非配置了查询缓存。虽然一级缓存中存在Student数据,但list不用,所以仍然发出查询语句, 其实list就是只向缓存中放入数据,而不利用缓存中的数据


四、总结

以上就是使用Hibernate框架在查询中需要注意的一些问题。在谈到N+1问题的时候,说到了缓存。那么缓存是提高Hibernate整个框架性能的一个重要因素,下篇博客谈谈Hibernate的缓存机制。它的一级缓存、二级缓存等的开启和管理!

相关文章: