0

我有两个休眠实体 A 和 B。A 和 B 之间存在多对多关联。

public class A {
  @ManyToMany(targetEntity=B.class)
  @JoinTable(name = "AB",
    joinColumns = @JoinColumn(name="A_FK"),
    inverseJoinColumns = @JoinColumn(name="B_FK"))  
  private Set<B> collectionOfB = new HashSet<B>();
  // ...
}

public class B {
  // no reference to A
}

我有一个 B 元素的数组 {b1, b2,... ,bn}。

我需要搜索与上面列表的所有 B 元素相关联的所有 A 元素({b1,b2,...,bn} 的所有元素都应该在 collectionOfB 中)。

所以我必须做这样的事情:

select * from A as a where {b1, b2,... ,bn} in a.collectionOfB 

但这是不可能的:-(

有谁知道如何处理这个问题?

谢谢

卡姆兰

4

2 回答 2

0

如果您的映射是正确的,您可以这样做:

    sql="select a.* from A a where ...";
    for (Long bId: myListOfBcriteria) {
        sql += " and " + bId+ " in (select ab.b_fk from AB ab where ab.a_fk=a.id)";
    }

在休眠中。

    select a from A join a.collectionOfB as ab where ab.id in (:collectionOfB)

如果你打算使用 ORM,你应该使用它,除非你绝对不能。

于 2013-01-27T22:15:05.020 回答
0

经过一番调查,我发现解决我的问题的最简单方法是通过session.createSQLQuery(sql).

和:

sql="select a.* from A a where ...";
for (Long bId: myListOfBcriteria) {
  sql += " and " + bId+ " in (select ab.b_fk from AB ab where ab.a_fk=a.id)";
}

哪里myListOfBcriteria={b1, b2,... ,bn}

也许它不是很“好”,但效果很好:-)

我希望这可以帮助一些人,

卡姆兰

于 2013-01-28T13:42:29.867 回答