2012-09-14 30 views
0
class A{ 
// one to many mapping 
    List<B> listOfB; 
    //getter and setter; 
    class B { 
    String s; 
    //getter and setter 
    } 

现在,当我得到类A时,它将返回listOfB中所有关联的类Bs。但是,我需要一定的条件,B应该在哪些方面做出回应。像Get A这样,listOfB包含所有这样的B,其中s ='something'。带内部列表条件的Hibernate NamedQuery

编辑:目前这是行不通的:

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

回答

0

1)我假设你映射从A一一对多关系b类似A.listOfB =了Bb

我想你查询可以被简化为:

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

等效休眠条件查询将是:

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

2)如果没有这些实体之间的映射关系,你可以使用一个SQLRestriction满场a.listOfB

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

更多的例子here

+0

你的HQL查询无效:b.b不存在,并且列表不能与实体进行比较。而且,这并不能解决OP的问题:他仍然可以得到每个A中完整的Bs列表,而不仅仅是符合标准的Bs。 –

0

尽管JPA规范说它应该被禁止,但你可以用Hibernate来做到这一点。事实上,当你得到一个A时,它的Bs列表应该总是一个Bs的完整列表。不是已被某些查询过滤的列表。我会避免这样做,因为它很危险。相反,我会用像查询以下内容:

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

现在你把所有的如您有兴趣到,所有的烧烤你有兴趣到:

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

如果你真的想要得到与Bs的部分列表一样,请使用以下查询。但你已经被警告过:它不是便携式的,而且很危险:

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