1

2 つの JPA エンティティがあるとします。

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

  @OneToMany
  private List<EntityB> b;

  ...
}

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

  ...
}

私が達成したいのは、どの からも参照されていないすべてのインスタンスを@NamedQuery取得する を定義することです。EntityBEntityA

素朴に、私は試したでしょう

@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)

ただし、要素は JPA ではなく、Hibernate HQL コンストラクトであることに注意してください。

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

これを試してください、

    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 に答える