我有
Class A{
List <B> bList
}
Class B {
String name;
}
现在我想使用 Hibrnate 标准 API 编写查询,这样我只得到 A pojo 的过滤 bList 属性只有 B pojo
where "b.name" == 'abc'
我有
Class A{
List <B> bList
}
Class B {
String name;
}
现在我想使用 Hibrnate 标准 API 编写查询,这样我只得到 A pojo 的过滤 bList 属性只有 B pojo
where "b.name" == 'abc'
这是一件非常危险的事情,尽管 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);
我已经尝试了上面的代码,在我看来它没有过滤 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 次,可能并不理想。如果还有其他选择,请纠正我。