Hibernate NamedQuery在内部List上有一个条件

时间:2012-09-14 11:46:33

标签: java sql hibernate named-query

    class A{
// one to many mapping
    List<B> listOfB;
    //getter and setter;
    class B {
    String s;
    //getter and setter
    }

现在,当我获得A类时,它将返回listOfB中所有相关的类B.但我需要一定的条件来决定B应该采取哪些措施。像Get A这样listOfB包含所有这样的B,其中s ='something'。

编辑:目前这不起作用:

select a from A a where a.listOfB IN (select b from a.listOfB b where b.s='something');

2 个答案:

答案 0 :(得分:0)

1)我假设您将A到B之间的一对多关系映射为A.listOfB = B.b

我认为您的查询可以简化为:

select a 
from A a, B b
where a.listOfB = b.b
and where b.s='something'

等效的Hibernate Criteria查询将是:

List results =  sess.createCriteria(A.class)  
    .createCriteria("listOfB")
    .add(Restrictions.eq("s", "something"))
    .list();

2)如果这些实体之间没有映射关系,则可以在字段a.listOfB上使用SQLRestriction

List results = sess.createCriteria(A.class)
.add( Restrictions.sqlRestriction("{alias}.listOfB in (selec b from B where b.s = ?)), "something", Hibernate.STRING) )
   .list();

更多示例here

答案 1 :(得分:0)

你可以用Hibernate做到这一点,虽然JPA规范说它应该被禁止。实际上,当你得到一个A时,它的B列表应该总是Bs的完整列表。不是某个查询过滤的列表。我会避免这样做,因为它很危险。相反,我会使用如下的查询:

select a, b from A a inner join a.listOfB b where b.s = 'something'

现在你拥有所有你感兴趣的,以及你感兴趣的所有B:

A1, B1
A1, B2
A2, B7
A2, B8

如果您确实希望获得部分B列表,请使用以下查询。但是你已经被警告:它不便携,而且很危险:

select a from A a inner join fetch a.listOfB b where b.s = 'something'