2015-01-14 17 views
5

Ho passato un paio d'ore a cercare in giro e non ho trovato nulla di simile al mio caso.JPA @JoinTable con condizioni di join aggiuntive

Supponiamo dopo molti-a-molti modello di dati:

 
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 

Ora supponiamo che voglio mappare tutti contratti relativi alla festa (unidirezionale). Esso può essere fatto utilizzando seguenti annotazioni in classe Party entità:

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

che è bene.

Ma quello che sto cercando è come mappare i contratti con il ruolo particolare ?

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

Tecnicamente sto cercando un modo per aggiungere condizioni supplementari in JOIN.

finora trovato seguendo le idee in argomenti simili:

  • mappa join tabella come entità separata, e eseguire il filtraggio in base al ruolo utilizzando query personalizzate;
  • Hibernate ha l'annotazione @JoinFormula, ma non c'è modo di applicarlo all'interno di @JoinTable;
  • Hibernate ha anche l'annotazione @Where, ma aggiunge la condizione per la tabella del contratto non per la tabella di join;
  • utilizza @MapKeyColumn e restituisce Mappa anziché Elenco, ma posso avere più contratti per un ruolo;
  • creare una vista sul lato DB (questo funziona davvero :)

Grazie!

risposta

11

È possibile utilizzare l'annotazione @WhereJoinTable. Si applica alla tabella di associazione

@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

Grazie mille, funziona come un fascino! – Vitaljok

+0

Grazie per le idee. Ho anche avuto questa domanda, ma dal punto di vista di tale: Come posso chiamare tutte le parti, in modo da avere un elenco di contratti corrispondenti a un ruolo = 'firmatario'? Posso usare una query per fare questo? Quesito JPA che è? –

+0

correlati: '@ JoinFormula' – Blauhirn

1

È necessario utilizzare:

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