2017-12-01 40 views
0

私はOneToManyの関係を実装しようとしており、子レコードの選択に本当に苦労しています。例えばJPA OneToMany重複する子

Parent P1 3つのChildエンティティとParentを有するP2が2つのChildエンティティを有し、

  • P1はC1、C2、C3
  • P2はC4、C6

を有していると言う。しかし以下のコードが返されます。

  • P1はC1、C1、C1
  • P2はC1、C1

は面白い子エンティティの数が正しいかありますが、データ自体はちょうど最初のレコードの複製です。私は別の設定を試みたが、それは助けに見えない。

CriteriaBuilder criteriaBuilder = db2EntityManager.getCriteriaBuilder(); 
CriteriaQuery<Parent> searchQuery = criteriaBuilder.createQuery(Parent.class); 
Root<Parent> aRoot = searchQuery.from(Parent.class); 

//Constructing list of parameters 
List<Predicate> predicates = new ArrayList<>(); 

//Adding predicates in case of parameter not being null 
predicates.add(criteriaBuilder.equal(aRoot.get("a"), "A")); 
predicates.add(criteriaBuilder.equal(aRoot.get("b"), "B")); 
predicates.add(criteriaBuilder.equal(aRoot.get("c"), "C")); 

//query itself 
searchQuery.select(aRoot).where(predicates.toArray(new Predicate[]{})).distinct(true); 

TypedQuery<Parent> query = db2EntityManager.createQuery(searchQuery); 
parentEntities = query.getResultList(); 
+0

あなたは何を保持しているかを知る必要がありますか?そして最終的にデータベースには何が入っていますか?私は「別れた」とはあなたの問題とは何の関係もないと思います。なぜそれらの述語は、詳細を教えてください? – pirho

+0

私はoneToManyデータを読み込み、何も格納しようとしていません。そのため、親エンティティPと子エンティティCは複合キーA、B、C、Dを共有します。述語はPのwhere条件です。基本的には、A、B、Cのid値を持つPにクエリを行い、A.Cの子レコードを取得しようとしています。 – Mjasmin

+0

以下は、ログから「子クエリ」を簡略化したものです。子どもA、子B、子C、子A、子B、 child.X、child.Y、child.Z、from、MAIN.CHILD child ここでchild.D =?そして、子供.A =?そして子供.B =?子供= C =? – Mjasmin

答えて

0

この問題は、子エンティティの主キーが原因であることが判明しました。複合キーは一意のレコードを返していませんでした。

関連する問題