我有两个Hibernate实体A和B. A和B之间存在ManyToMany关联。
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
但这是不可能的: - (
有人知道如何处理这个问题吗?
由于
卡姆兰
答案 0 :(得分: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)";
}
在Hibernate中。
select a from A join a.collectionOfB as ab where ab.id in (:collectionOfB)
如果你打算使用ORM,你应该使用它,除非你绝对不能。
答案 1 :(得分:0)
经过一番调查后,我发现处理问题的最简单方法是通过session.createSQLQuery(sql)
使用原生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}
。
也许这不是很“好”,但效果很好: - )
我希望这可以帮助一些人,
卡姆兰