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接收查询结果:
控制台打印结果:
解决方案:每次执行list操作后会将数据放到session的缓存中(一级缓存),所以采用iterate的时候, 首先会发出一条查询id列表的语句,再根据id到缓存中加载相应的数据,如果缓存中存在与之匹配的数据,则不再发出根据id查询的sql语句,直接使用缓存中的数据。
所以,使用list去接收查询的语句,可避免N+1的问题。但如果缓存中存在数据,使用Iterate会比使用List性能高!注意: 在默认情况下,每次执行list查询实体对象都会发出查询语句,除非配置了查询缓存。虽然一级缓存中存在Student数据,但list不用,所以仍然发出查询语句, 其实list就是只向缓存中放入数据,而不利用缓存中的数据
四、总结
以上就是使用Hibernate框架在查询中需要注意的一些问题。在谈到N+1问题的时候,说到了缓存。那么缓存是提高Hibernate整个框架性能的一个重要因素,下篇博客谈谈Hibernate的缓存机制。它的一级缓存、二级缓存等的开启和管理!