2016-03-20 78 views
1

我有一個非常有趣的問題:如果我有3個表,我如何加入休眠?例如:有表A,B,C;休眠JPA,加入多個表

@Entity 
public class A { 
     private String name; 
     private Int idA; 
     ... 
} 

@Entity 
public class B { 
     private String lastName; 
     private Int idB; 
     ... 
} 

@Entity 
public class C { 
     private String name; 
     private String lastName; 
     ... 
} 

和我的祖國查詢將是這樣的:「選擇*從內JOIN B內部聯接上a.idA = b.idB和b.lastName = c.lastName c和a.name = c.name 「

在Hibernate中,你可以使用@JoinColum如果你想加入2個表,並且@JoinTable,如果您正在使用表C.通過表B.在HQL加盟表格中的

這樣的查詢將類似於:」從a內連接ab作爲b內連接ac「,其中

@Entity 
public class A { 
... 
@OneToMany 
@JoinColumn(name="idB", referencedColumnName="idA") 
private List<B> b; 
... 

@ManyToMany 
@JoinTable(name = "B", 
    joinColumns = {@JoinColumn(name="idB", referencedColumnName="ioA")}, 
    inverseJoinColumns = {@JoinColumn(name="lastName",referencedColumnName="lastName")} 
) 
private List<C> c; 
... 
} 

但仍然在這種情況下,我沒有從表一表C的直接訪問,誰能給我解釋一下我怎麼才能

select * from a inner join b inner join c on a.idA = b.idB and b.lastName = c.lastName and a.name = c.name 

在HQL和JPA

+0

你必須定義一個關係,不是嗎? –

回答

1

對於JPA瞭解您的數據庫結構,你也需要定義關係。

@Entity 
public class A { 
     private String name; 
     private Int idA; 

     @OneToMany(fetch = FetchType.LAZY, mappedBy = "a") 
     private List<B> bs = new ArrayList()<>; 
     ... 
} 

@Entity 
public class B { 
     private String lastName; 
     private Int idB; 

     @ManyToOne 
     private A a; 

     @OneToMany(fetch = FetchType.LAZY, mappedBy = "b") 
     private List<C> cs = new ArrayList()<>; 
     ... 
} 

@Entity 
public class C { 
     private String name; 
     private String lastName; 

     @ManyToOne 
     private B b; 
     ... 
} 

然後你就可以做

A a = yourARepository.findById(1); 
List<B> bs = a.getBs(); 
For(B b : bs){ 
    List<C> cs = b.getCs(); 
} 

這只是一個抄寫員構成了我的頭頂,給你的想法一樣簡單。您可能需要做一些調整。當我回家後,我可以嘗試並修復它。 :)