查找未从其他实体引用的所有JPA实体

时间:2012-06-01 10:35:48

标签: java hibernate jpa

假设我有两个JPA实体:

@Entity
public class EntityA {
  @Id
  private String id;

  @OneToMany
  private List<EntityB> b;

  ...
}

@Entity
public class EntityB {
  @Id
  private String id;

  ...
}

我想要完成的是定义@NamedQuery,以检索未从任何EntityB引用的所有EntityA个实例。

天真地,我会尝试

@NamedQuery(name = "EntityB.findAllUnassigned", query = "SELECT b FROM EntityB b WHERE NOT b IN (SELECT DISTINCT a.b FROM EntityA a)")

但最终会生成无效的SQL:

select b0_.id as id1_, b0_.attr, ... from b b0_ where b0_.id not in  (select distinct . from a a1_, a_b ab2_, b b3_ where a1_.id=ab2_.a_id and ab2_.b_id=b3_.id)

任何替代方案?

4 个答案:

答案 0 :(得分:4)

很奇怪这个查询没有给你一个例外。但是你的b.a参考是不合法的;你不能选择集合本身,你想要/需要选择集合元素。

SELECT b FROM EntityB b WHERE b NOT IN (SELECT DISTINCT elements(a.b) FROM EntityA a)

但请注意,元素是Hibernate HQL构造,而不是JPA。

如果您关心JPA可移植性:

SELECT b FROM EntityB b WHERE b NOT IN (SELECT DISTINCT b2 FROM EntityA a join a.b b2)

* NOT IN是更正常的形式,所以我也在这里使用

答案 1 :(得分:0)

无效的SQL是什么意思? 你真的试过...WHERE b NOT IN...(注意未改变的位置)

答案 2 :(得分:0)

请试试这个,

    SELECT DISTINCT b FROM EntityB AS b JOIN b.a AS a WHERE a IS NULL

如果你不能,试试那个

    SELECT DISTINCT b FROM EntityB AS b JOIN b.a AS a WHERE a.id IS NULL

答案 3 :(得分:0)

EntityB不知道它属于哪个EntityA。在JPQL中可能有一些模糊甚至是直观的方式来做你想做的事情。但是从我的角度来看,如果你想提出这样的问题,你就无法对对象模型进行建模。

&#34;嘿B,你的A是什么 - 或者它是非常外的&#34; 将得到以下答案: &#34;什么是&#34; A&#34;&#34;。

将有关其明显关系的信息添加到B中的A,将很快解决您当前的设计问题。