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');
答案 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'