Hibernate使用包含列表中所有元素的条件选择manyToMany关联

时间:2013-01-25 12:16:42

标签: hibernate many-to-many hql hibernate-criteria

我有两个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 

但这是不可能的: - (

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

由于

卡姆兰

2 个答案:

答案 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}

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

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

卡姆兰