0

我有

Class A{
  List <B> bList

}

Class B {
 String name;

}

现在我想使用 Hibrnate 标准 API 编写查询,这样我只得到 A pojo 的过滤 bList 属性只有 B pojo

 where "b.name"  == 'abc'
4

2 回答 2

5

这是一件非常危险的事情,尽管 Hibernate 支持它,但 JPA 不支持它,因为它加载的实体并不反映存储在数据库中的真实情况。如果你碰巧修改了 B 的列表,Hibernate 可能会删除所有属于 A 的 B,但这些 B 还没有被查询加载。

也就是说,这是一个带有 fetch 模式的简单内部联接:

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);
于 2012-02-06T22:05:31.980 回答
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 次,可能并不理想。如果还有其他选择,请纠正我。

于 2015-11-25T07:14:06.000 回答