在hql中关键字不区分大小写,属性和类名区分大小写
1、简单属性查询(重要)
* 单一属性查询,返回结果集是属性列表,其元素类型和实体类中相应的属性类型一致
* 多个属性查询,返回的结果集是对象数组,数组的长度和查询的属性的个数一致
数组元素的类型和查询的属性类型一致
* 如果认为返回的数组不够对象化,可以采用hql动态生成实体对象
参加:SimplePropertyQueryTest.java
2、实体对象查询(重要)
* N+1问题,在默认情况下使用query.iterate查询,有可能出现N+1问题,所谓的N+1
是查询对象的时候发出了N+1条sql语句
1:首先发出一条查询id列表的sql
N:根据id列表发出n条查询语句
* list和iterate的区别?
* list在默认情况下,只向缓存中放入数据,而不利用缓存中的数据
* iterate在默认情况下有N+1问题,如果缓存中存在数据那么会根据id到缓存获取数据
也就说iterate是利用缓存的
参见:SimpleObjectQueryTest1.java,SimpleObjectQueryTest2.java
3、条件查询(重要)
* 可以采用拼字符串的方式传递参数
* 可以采用 ?号的方式传递参数
* 可以采用 :参数名的方式传递参数
* 如果传递多个参数,使用setParameterList来传递
* 在hql中可以使用数据库的函数,如:date_format
* 参见:SimpleConditionQueryTest.java
4、hibernate也支持直接sql进行查询
参见:SqlQueryTest.java
5、外置命名查询
* 在映射文件中采用<query>标签来定义hql
* 在程序中使用session.getNamedQuery()来得到hql查询串
参见:NameQueryTest.java
6、查询过滤器
* 在映射文件中定义过滤器的参数
* 在类的映射文件中使用过滤器参数
* 在程序中启用过滤器
参见:FilterQueryTest.java
7、分页查询(重要)
* setFirstResult(),数据的起始位置,从0开始
* setMaxResults, 每页显示多少条数据
参见:PageQueryTest.java
8、对象导航查询,在hql中采用.进行导航(重要)
参见:ObjectNavQueryTest.java
9、连接查询(重要)
* 内连接
* 外连接(左连接/右连接)
参见:JoinQueryTest.java
10、统计查询(重要)
参见:StatQueryTest.java
11、DML风格的操作(建议尽量少用,因为它和缓存不同步)
参见:DMLQueryTest.java