2017-05-22 2 views
0

Ich habe einen Fall, in dem ich 3 Tabellen beitreten muss. Die Situation ist wie folgt:Multi-Table Join im Winterschlaf

  1. Asset-Tabelle.
  2. Transaktionstabelle.
  3. Mitarbeiter Tabelle. Jetzt

,

a) Vermögen kann mehrere Transaktionen haben gibt es eine Beziehung von OneToMany.
b) Eine Transaktion kann nur zu einem Mitarbeiter gehören Also eins zu eins Relation.

-> Ich muss Liste der Vermögenswerte für einen Mitarbeiter erhalten.

Mein Schema ist:

a) AssetTbl: 

@Id 
@ColumnName("ASSETID") 
int assetId; 

@OneToMany() 
@JoinColumn(name="ASSET_ID",referncedColumnName="AssetId") 
List<TransactionTbl> trans; 

b) TransactionTbl: 

@Id 
@ColumnName("TRANS_ID") 
int transId; 

@ColumnName("ASSET_ID") 
int assetId; 

@OneToOne() 
@JoinColumn(name="Emp_ID",referncedColumnName="Emp_Id") 
EmployeeTbl emp; 

c) EmployeeTbl: 

@Id 
@ColumnName("Emp_ID") 
int empId; 

Wenn ich beitreten und auf Abfrage ausführen es gibt Ausnahme employeeTbl existiert nicht in AssetTbl. Gibt es ein Problem in meinem Schema?

+0

Wenn ein Vermögenswert viele Transaktionen hat, warum verwenden Sie einen OneToOne? Warum speichern Sie die ID eines Assets in Transaction anstelle von ManyToOne in das Asset? Und natürlich, warum postest du nicht die Ausnahme-Stack-Trace und den Code, der es verursacht? –

Antwort

1

Ich glaube, AssetTbl hat transactionId. Die Transaktionstabelle hat employeeId als Referenz.

Finden Sie die folgenden Abfragen, um die Assets für eine emp.

@Query("select assetTbl from AssetTbl as assetTbl 
inner join assetTbl.trans as trans 
inner join trans.emp as emp 
where emp.empId = :empId) 

oder

<query name="findAssetByEmployee"> 
    <query-param name="empId" type="long"/> 
    select assetTbl from AssetTbl as assetTbl 
    inner join assetTbl.trans as trans 
    inner join trans.emp as emp 
    where emp.empId = :empId 
</query>