2015-01-14 8 views
5

Spędziłem kilka godzin na wyszukiwaniu i nie znalazłem niczego podobnego do mojego przypadku.JPA @JoinTable z dodatkowymi warunkami łączenia

Przyjmijmy następujące wiele-do-wielu modelu danych:

 
Contract (any business entity) 
- contract_id 
- other fields 

Party (another business entity) 
- party_id 
- other fields 

Contract_Party (relations between first two 
with additional role indicator, e.g. owner, signer, seller, etc) 
- contract_id 
- party_id 
- role 

Teraz załóżmy, że chcę map wszystkie kontrakty związane z partii (jednokierunkowa). Można to zrobić za pomocą następujących adnotacji w klasie jednostki Party:

@OneToMany 
@JoinTable(
    name="Contract_Party", 
    joinColumns = {@JoinColumn(name="party_id", referencedColumnName="party_id")}, 
    inverseJoinColumns = {@JoinColumn(name="contract_id", referencedColumnName="contract_id")} 
} 
private List<Contract> contracts; 

To dobrze.

Ale czego szukam, to jak mapować umowy z szczególną rolą?

@OneToMany 
@??? ("ROLE = 'SIGNER' ") 
private List<Contract> signedContracts; 

Technicznie Szukam sposobu, aby dodać dodatkowy warunekdo JOIN oświadczenie.

Dotychczas stwierdzono następujące pomysły w podobnych tematów:

  • mapa dołączyć tabelę jako odrębny podmiot i wykonywać filtrowanie według roli za pomocą niestandardowych zapytań;
  • Hibernate ma adnotację @JoinFormula, ale nie ma możliwości zastosowania jej w @JoinTable;
  • Hibernate ma również adnotację @Where, ale dodaje warunek dla tabeli kontraktów nie dla tabeli dołączeń;
  • użyj @MapKeyColumn i zwróć mapę zamiast listy, ale mogę mieć wiele umów na jedną rolę;
  • utworzyć widok z boku DB (ten rzeczywiście działa :)

Dzięki!

Odpowiedz

11

Możesz użyć adnotacji @WhereJoinTable. Ma ona zastosowanie do stołu stowarzyszenia

@OneToMany 
@JoinTable(
    name="Contract_Party", 
    joinColumns = {@JoinColumn(name="party_id",referencedColumnName="party_id")}, 
    inverseJoinColumns = {@JoinColumn(name="contract_id", referencedColumnName="contract_id")} 
} 
@WhereJoinTable ("ROLE = 'SIGNER' ") 
private List<Contract> contracts; 
+0

Dzięki, działa jak uroku! – Vitaljok

+0

Dzięki za pomysły. Też miałem to pytanie, ale z punktu widzenia takich: Jak mam zadzwonić do wszystkich stron, aby mieć listę umów odpowiadających roli = "podpisowi"? Czy mogę to zrobić za pomocą zapytania? Zapytanie JPA to jest? –

+0

powiązane: '@ JoinFormula' – Blauhirn

1

należy użyć:

@WhereJoinTable(clause = "ROLE ='SIGNER'") 
Powiązane problemy