2012-02-06 61 views

回答

5

这是一件非常危险的事情,尽管它受Hibernate支持,但它不是由JPA支持的,因为它加载的实体并不能反映存储在数据库中的实体。如果您碰巧修改了B的列表,Hibernate可能会删除所有B到B的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); 
+0

所以它很好,如果我们只读正确的? – digz6666 2014-06-11 09:55:26

+0

除非您向用户显示不正确的数据,否则会根据此不正确的数据做出灾难性决策。 – 2014-06-11 10:08:12

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); 得到不同类

它查询2次,DB和可能是不希望。如果有其他选择,请纠正我。