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

Thi*_*kel 1 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;

  ...
}
Run Code Online (Sandbox Code Playgroud)

我想要完成的是定义一个@NamedQuery检索所有EntityB未从任何EntityA.

天真地,我会尝试

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

但这最终会生成无效的 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)
Run Code Online (Sandbox Code Playgroud)

任何替代方案?

Ste*_*ole 5

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

SELECT b FROM EntityB b WHERE b NOT IN (SELECT DISTINCT elements(a.b) FROM EntityA a)
Run Code Online (Sandbox Code Playgroud)

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

如果您关心 JPA 可移植性:

SELECT b FROM EntityB b WHERE b NOT IN (SELECT DISTINCT b2 FROM EntityA a join a.b b2)
Run Code Online (Sandbox Code Playgroud)

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