Hibernate Criteria API过滤集合属性

时间:2012-02-06 21:50:57

标签: hibernate hibernate-criteria detachedcriteria

我有

Class A{
  List <B> bList

}

Class B {
 String name;

}

现在我想使用Hibernate标准API编写查询,这样我只能获得一个带有过滤的bList属性的Pojos,只有B pojo的

 where "b.name"  == 'abc'

2 个答案:

答案 0 :(得分:5)

这是一件非常危险的事情,虽然Hibernate支持它,但它不是由JPA支持的,因为它加载的实体并不能反映数据库中存储内容的实际情况。如果您碰巧修改了B列表,Hibernate可能会删除所有与A无关但尚未被查询加载的B.

那就是说,这是一个带有获取模式的简单内连接:

Criteria c = session.createCriteria(A.class, "a");
c.createAlias("a.b", "b");
c.add(Restrictions.eq("b.name", "abc");
c.setFetchMode("a.b", FetchMode.JOIN);

答案 1 :(得分:0)

我已经尝试过上面的代码,在我看来它不会过滤B集合。

我最后做的是在A级添加额外的过滤器

@FilterDef(name="BFilter",  
parameters= @ParamDef( name="bName", type="string" ) )
Public class A{

    @Filter(
        name = "BFilter",
        condition="name = :bName"
    )
    private List<B> bList;
}

然后我使用setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY); 获得不同的A类

它向DB查询2次,可能不合适。如果还有其他选择,请纠正我。