2016-03-20 5 views
1

私は非常に興味深い質問があります:私は3つのテーブルを持っている場合、どのように私は休止状態に参加するのですか?例:テーブルA、B、Cを持つ。複数のテーブルを結合するHibernate 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; 
     ... 
} 

と私のネイティブクエリは次のようになります。「内側から*選択をb、内側がa.idA = b.idBとb.lastName = c.lastNameとa.name = c.nameにCに参加する参加から:「あなたはHQLクエリでそのテーブルB

を経由して、テーブルCとテーブルAに参加している場合は、あなたが2つのテーブルを結合したい場合@JoinColumを使用して、@JoinTableでき休止中

は次のようになります」 Aは内部結合a bを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にテーブルAからの直接アクセスを持っていけない、この場合には、誰もが私はあなたのDBの構造を理解するためにJPAについて

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

を取得する方法を私に説明することができます関係を定義する必要があります。

@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(); 
} 

のような単純な何かを行うことができます。いくつかの調整が必要な場合があります。私は家に帰るときにそれを試して修正することができます。 :)

関連する問題