Hibernate对收集元素施加限制与获取模式冲突
我使用Hibernate 4.3.8作为我们MySql数据库的ORM工具。 我有一个类被映射,它被注释如下:
@Entity
@DynamicUpdate
@Table(name = "myclass")
public class MyClass {
@Id
@Column(name = "myClassId")
private String id;
@Column(name = "status")
private String status;
@ElementCollection(fetch = FetchType.EAGER)
@CollectionTable(name = "myclass_children", joinColumns = @JoinColumn(name = "myClassId"))
@Column(name = "child")
@Fetch(FetchMode.JOIN)
@BatchSize(size = 100)
@Cascade(value = CascadeType.ALL)
private Set<String> children;
}
要通过Hibernate执行读取查询,我被要求使用Criteria API。 在开始时我应该提到使用HQL或SQL不是选项。
使用下面的代码执行我想要做的事情:执行第二个选择查询来检索集合元素并返回恰好20个MyClass对象。
public List<MyClass> listEntities() {
Session session = sessionFactory.openSession();
try {
Criteria criteria = session.createCriteria(MyClass.class);
criteria.setFetchMode("children", FetchMode.SELECT);
criteria.add(Restrictions.eq("status", "open"));
criteria.setResultTransformer(CriteriaSpecification.DISTINCT_ROOT_ENTITY);
criteria.setMaxResults(20);
}
}
以下是生成的查询:
select
this.myClassId as myClassId_1_0_0,
this.status as status_2_0_0
from
myclass this
where
status = ?
limit ?
select
children0.myClassId as myClassId1_0_0,
children0.child as child2_0_0
from
myclass_children as children0_
where
children0_.myClassId in (
?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?
)
但是,当我尝试对收集元素进行限制时,hibernate执行单个连接查询。 当此单个查询的结果集中的行数(不是不同的根实体)达到极限时,Hibernate将返回现有的MyClass对象作为结果。 如果每个MyClass对象为2个子项,则返回10个MyClass对象。
public List<MyClass> listEntities() {
Session session = sessionFactory.openSession();
try {
Criteria criteria = session.createCriteria(MyClass.class);
criteria.setFetchMode("children", FetchMode.SELECT);
criteria.createCriteria("children", "ch", JoinType.LEFT_OUTER_JOIN);
criteria.add(Restrictions.eq("status", "open"));
criteria.add(Restrictions.in("ch.elements", Arrays.asList("child1", "child2"));
criteria.setResultTransformer(CriteriaSpecification.DISTINCT_ROOT_ENTITY);
criteria.setMaxResults(20);
}
}
这是生成的查询:
select
this.id as id1_0_0,
this.status as status2_0_0,
ch.child as child1_0_2
from
myclass this
left outer join
myclass_children ch1_
on this.myClassId = ch1_.myClassId
where
this.status = ? limit ?
我能做些什么来获得20个MyClass对象,同时对收集元素添加限制? 欢迎任何建议和答案!
注意:@Fetch(FetchMode.JOIN)注释用于其他代码库(如通过ID选择等)。 它应该不会对我的问题产生任何影响,因为我分别为条件对象设置FetchMode.SELECT。
链接地址: http://www.djcxy.com/p/36987.html上一篇: Hibernate putting restrictions on collection elements conflicts with fetch mode