hibernate hql语句关联和动态关联实例源码介绍。
代码片段如下:
List l = session.createCriteria(Student.class)
//此处增加限制条件必须是Student已经存在的属性
.add(Restrictions.get(“studentNumber”, 20050231L))
//如果要增加对Student的关联类的属性的限制
//则必须重新createCriteria()
//如果此关联属性是集合,则只要集合里任意一个对象的属性满足下面条件即可
.createCriteria(“enrolments”)
.add(Restrictions.gt(“semester”,2))
.list();
上面的代码表示建立Person类的条件查询,第一个查询条件是直接过滤Person的属性。第二个查询条件则过滤Person的关联实体的属性,其中enrolments是Person类的关联实体,而semester则是Enrolment类的属性。值得注意的是,返回的并不是Enrolment对象,而是Person对象的集合。
注意:使用关联类的条件查询,依然是查询原有持久化类的实例,而不是查询被关联类的实例。
可使用条件查询支持的替换形态,将上面查询代码替换成如下形式:
List l = session.createCriteria(Student.class)
.add(Restrictions.gt(“studentNumber”,20050231L))
.createAlias(“enrolments”,”en”)
.add(Restrictions.gt(“semester”,2))
.list();
createAlias()方法并不创建一个新的Criteria实例,它只是给关联实体(包含集合里包含的关联实体)起一个别名,让后面过滤条件可根据关联实体进行筛选。
在默认情况下,条件查询将根据映射文件指定的延迟加载策略来加载关联实体,如果希望在条件查询中改变延迟加载策略(就像在HQL查询中使用fetch关键字一样),那就可通过Creteria的setFetchMode()方法来实现,该方法接受一个FetchMode参数。
FetchMode里有几个常量,如下:
DEFAULT:使用配置文件制定的延迟加载策略处理。
JOIN:使用外连接,预初始化所有关联实体。
SELECT:启用延迟加载,系统将使用单独的select语句来初始化关联实体。只有当个真正访问关联实体的时候,才会执行第二条select语句。
初始化Student对象时,也可以初始化Student关联的Enrolment实体,实体使用如下代码:
List l = session.createCriteria(Student.class)
.add(Restrictions.gt(“studentNumber”,20050231L))
.setFetchMode(“enrolments”, FetchMode.JOIN)
.list();