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

下一篇: Matching *ALL* items in a list with Hibernate criteria