2017-08-22 8 views
0

私は、Spring Data JPAでQueryDSLを使用しようとしています。QueryDSLを使用した複数の結合

私のデータベースには3つのテーブルがあります。

1)アカウント情報と具体的にはアカウント番号を持つアカウントテーブル。 2)アカウントに人の役割(所有者など)と対応するアカウント番号とその人ID番号を持つPersonRoleテーブル。 3)人の列を持つ人のテーブル。彼らのID番号と名前、名字等...

が私のエンティティは次のようになります。

@Entity 
Account{ 
...Other fields ommited 
**@OneToMany 
@JoinColumn(name = "ACCNT_NUMBER") 
List<PersonRole> personRoles;** 
} 

@Entity 
PersonRole{ 
String role; 
...Other fields ommited 
**@OneToOne 
@JoinColumn(name = "PERSON_ID") 
Person person;** 
} 


@Entity 
Person{...} 

私は人姓と名で選択していることを使用するアカウントをフィルタリングします関連付けられた個人および人物を有する契約実体を埋める。

私はこれを行うためにジョインを作成する必要があると仮定します。私はたくさんのことを試みましたが、私は間違いを続けています。対応するQClassを作成しました。私は以下のコードが間違っていることを知っていますが、うまくいかないかもしれませんが、おそらくあなたは私が正しい道にいるかどうかを知ることができ、おそらく私を助けます。どんな助けでも大歓迎です。ありがとうございました!あなたは多くの1つでフィルタしたいときにのみ必要

QAccount account = QAccount.account; 
    QPersonRole personRoles = QPersonRole.personRole; 
    QPerson person = QPerson.person; 

    JPAQuery<Account> query = new JPAQuery<>(entityManager); 

    List<Account> accountList = query 
      .from(account) 
      .innerJoin(acccount.personRoles, personRoles) 
      .innerJoin(person) 
      .where(person.lastName.eq("John") 
        .and(person.lastName.eq("Doe"))) 
      .fetch(); 
+0

「契約」とはどういう意味ですか?質問に「契約」のコードはありません。また、 'PersonRole'から' Person'への '@ OneToOne'の関連付けはなぜですか?おそらく、単一の 'Person'は複数の' Account'sの中で役割を持つことができます。これは複数の 'PersonRole'レコードを意味し、' Person'が役割を持つ 'Account'ごとに1つです。したがって、 'PersonRole'から' Person'への '@ ManyToOne'関連があるはずです。もしそうでなければ、 'Person'自身でロール名とアカウント参照を保存するだけではどうですか? – manish

+0

申し訳ありません、私は契約ではなくアカウントを意味していました。私は編集しました。だから実際には、アカウントと人の間に多かれ少なかれ多くの関係があるので、私たちが結合テーブルを使用することを解決するためです。人は契約上、そして異なる契約上で多くの役割を果たすことができますが、私はそれをonetooneにすることによって契約上のすべての役割に対して人を得られると考えました。私はそれをonetomanyに変えるべきですか? – ejgreenwald

答えて

2

はJPQLはまだ活用することができる...合流...と私はそうpersonRoleに単数形を使用することを好む:

QAccount account = QAccount.account; 
QPersonRole personRole = QPersonRole.personRole; 

JPAQuery<Account> query = new JPAQuery<>(entityManager); 

List<Account> accountList = query 
      .from(account) 
      .innerJoin(acccount.personRoles, personRole) 
      .where(personRole.person.lastName.eq("John") 
        .and(personRole.person.lastName.eq("Doe"))) 
      .fetch(); 

Personへの参加が必要でないことに注意してください。

+0

あなたは主人公です。すべてのあなたの助けをありがとう!今度はBooleanBuilderと一緒にまとめておく必要がありますし、Spring Data Paginationも使いたいと思っています。これらの点を接続するためのアドバイスがあれば、それを聞いてみてください:) – ejgreenwald

+0

クエリdslでジョインするときに、バネデータのページネーションを使用することはできません。限界とオフセットはお友達です。あなたが参加して春のデータを使用する方法を見つけ出すことができる場合は、私に教えてください –

関連する問題