1

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

4 回答 4

5

奇怪的是,这个查询没有给你一个例外。但是您的 ba 参考以这种方式是不合法的;您不能选择集合本身,您想要/需要选择集合元素。

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 是更正常的形式,所以我在这里也使用了它

于 2012-06-01T11:52:35.630 回答
0

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

于 2012-06-01T10:44:37.933 回答
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
于 2012-06-01T11:06:39.717 回答
0

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

“嘿 B,你的 A 是什么——或者它不存在” 将得到回答:“什么是“A””。

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

于 2012-06-01T11:24:14.583 回答