2015-01-14 14 views
5

Ich habe einige Stunden damit verbracht, herumzusuchen und habe nichts gefunden, was meinem Fall ähnlich ist.JPA @JoinTable mit zusätzlichen Join-Bedingungen

Lassen Sie uns folgende many-to-many-Datenmodell übernehmen:

 
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 

Nun nehmen wir an, ich alle Verträge im Zusammenhang mit Partei (unidirektional) zuordnen möchten.

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

Das ist in Ordnung: Es kann mit folgenden Anmerkungen in Party Entitätsklasse erfolgen.

Aber was ich suche ist, wie Verträge mit besondere Rolle zuordnen?

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

Technisch Ich bin auf der Suche nach einem Weg, zusätzliche Bedingung in JOIN-Anweisung hinzuzufügen.

Bisher folgende Ideen in ähnlichen Themen gefunden:

  • Kartentabelle als separate Einheit verbinden, und führen Sie das Filtern nach Rolle mithilfe von benutzerdefinierten Abfragen;
  • Hibernate hat @JoinFormula Annotation, aber keine Möglichkeit, es in @JoinTable anzuwenden;
  • Hibernate hat auch @Where Annotation, aber es fügt Bedingung für Contract-Tabelle nicht für Join-Tabelle hinzu;
  • @ MapKeyColumn verwenden und Karte anstelle von Liste zurückgeben, aber ich kann mehrere Verträge pro Rolle haben;
  • einen Blick auf DB Seite erstellen (diese funktioniert in der Tat :)

Dank!

Antwort

11

Sie können die Annotation @WhereJoinTable verwenden. Sie gilt für die Zuordnungstabelle

@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

Vielen Dank, arbeitet als ein Charme! – Vitaljok

+0

Danke für die Ideen. Ich hatte auch diese Frage, aber aus der Sicht von solchen: Wie rufe ich alle Parteien, so dass eine Liste von Verträgen entsprechend einer Rolle = "Unterzeichner" haben? Kann ich dazu eine Abfrage verwenden? JPA-Abfrage, die ist? –

+0

verwandt: '@ JoinFormula' – Blauhirn

1

Sie verwenden müssen:

@WhereJoinTable(clause = "ROLE ='SIGNER'") 
Verwandte Themen