2017-08-22 62 views
0

我正在嘗試使用Spring Data JPA的QueryDSL。使用QueryDSL的多個連接

我的數據庫有3個表格。

1)一個包含賬戶信息和賬戶號碼的賬戶表。 2)一個PersonRole表,它具有一個人在一個賬戶上的角色(如所有者)以及相應的賬號和他的人員ID號。 3)有人排的人桌。他們的身份證號碼和名字,姓氏等..

我的實體是這樣的:

@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{...} 

我要篩選我被人名字和姓氏選擇的帳戶,然後使用以填充具有相關人員和人員的合同實體。

我假設我必須創建連接來完成此操作。我嘗試了一堆東西,但我不斷收到錯誤。我創建了相應的QClasses。我知道下面的代碼是錯誤的,它不起作用,但也許你可以看到我是否在正確的軌道上,並可能幫助我。任何幫助是極大的讚賞。謝謝!

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中起作用,這意味着多個PersonRole記錄,每個Account都有一個用於Person的角色。因此,應該有一個從'PersonRole'到'Person'的'@ ManyToOne'關聯。如果沒有,爲什麼不把角色名稱和帳戶引用存儲到'Person'本身? – manish

+0

對不起,我的意思是賬戶不是合同。我編輯過。所以真的有一個帳戶和人之間的多對多關係,以便解決我們使用連接表。雖然一個人可以在合同上以及在不同的合同中擔任很多角色,但我認爲通過將其合併到一個合約上的每個角色都會得到一個人。我是否應該將其改爲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中進行連接時,您將無法使用彈簧數據的分頁。限制和抵消是你的朋友。如果你可以弄清楚如何在連接中使用彈​​簧數據,那麼讓我知道 –