0
    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');
4

2 回答 2

0

1)我假设您映射了从 A 到 B 的一对多关系,例如 A.listOfB = Bb

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

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();

更多例子在这里

于 2012-09-14T12:02:21.740 回答
0

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

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

现在您拥有所有您感兴趣的 As 和所有您感兴趣的 B:

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

如果您真的想获得带有部分 B 列表的 As,请使用以下查询。但是你已经被警告了:它不是便携式的,而且很危险:

select a from A a inner join fetch a.listOfB b where b.s = 'something'
于 2012-09-14T12:02:53.783 回答