2016-03-20 26 views
1

Çok ilginç bir sorum var: 3 tablonun olması durumunda hazırda bekletme moduna nasıl katılırım? Örnek: A, B, C tablosuna sahip olmak;Hibernate JPA, birden çok tabloya katılıyor

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

ve nasıl görüneceğini benim ana sorgusu: "Bir iç iç b a.idA = b.idB ve b.lastName = c.lastName üzerinde c katılmak katılmak seçin * ve a.name = c.name "

hazırda size 2 tabloları katılmak ister eğer @JoinColum kullanabilir ve @JoinTable, sen HQL içinde

böylece tablo B yoluyla tablo C tablo A katılmadan eğer sorgu gibi görünecektir içinde

:" dan Bir içsel birleşme, b, b iç birleştirmesi olarak, "

ama yine ben tablo C'ye tablo A'dan doğrudan erişimi yok bu durumda, herkes senin DB yapısını anlamak için JPA için

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 içinde

ve JPA

+0

Bir ilişki tanımlamanız gerekmiyor, değil mi? –

cevap

1

alacağı bana nasıl açıklayabiliriz ilişkileri de tanımlamanız gerekir.

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

Ve sonra

sadece bir sürtme size bir fikir vermek için kafamın üst oluşturacak olan
A a = yourARepository.findById(1); 
List<B> bs = a.getBs(); 
For(B b : bs){ 
    List<C> cs = b.getCs(); 
} 

kadar basit bir şey yapabilirsiniz. Bazı ayarlamalar yapmanız gerekebilir. Eve geldiğimde daha sonra deneyebilirim. :)

İlgili konular