2016-03-20 54 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(); 
} 

这只是一个抄写员构成了我的头顶,给你的想法一样简单。您可能需要做一些调整。当我回家后,我可以尝试并修复它。 :)