2013-09-23 90 views
1
我從我們建立使用JPA(TopLink的) 模型具有生成SQL的一個問題

許多SQL的調用的結果,我們有以下TopLink的JPA孩子取的兒童

@Entity 
@Table(name = "T_TEST_A") 
@Access(AccessType.FIELD) 
public class TTestA implements Serializable { 

@Id 
@Column(name = "A_ID") 
private String id; 

@OneToOne 
@PrimaryKeyJoinColumn 
private D detail; 


@OneToMany() 
@JoinTable(name = "T_TEST_JOIN", joinColumns = @JoinColumn(name = "TABLE_FK"), inverseJoinColumns = @JoinColumn(name = "B_ID")) 
private List<B> childrens; 
... 
} 

@Entity 
@Table(name = "T_TEST_B") 
@Access(AccessType.FIELD) 
public class TTestB implements Serializable { 

@Id 
@Column(name = "B_ID") 
private String id; 

@OneToOne 
@PrimaryKeyJoinColumn 
private D detail; 
... 
} 

@Entity 
@Table(name = "T_TEST_D") 
@Access(AccessType.FIELD) 
public class D implements Serializable { 

@Id 
@Column(name = "D_ID") 
private String id; 

@OneToOne 
@PrimaryKeyJoinColumn 
private M moreDetail; 
... 
} 

這基本上是一個一對多使用3表格關係。使用Criteria API,我可以在一個SQL中使用fetch獲得A的第一級和所有一對一關係(級聯)和A的子級,即A => D => M,但是我可以'讓孩子B => D => M表現相同。

我最終得到A,D,M和B的SQL查詢,但隨後多個查詢得到B => D => M。

這裏是我做的:

final CriteriaBuilder cb = em.getCriteriaBuilder(); 
    final CriteriaQuery<A> c = cb.createQuery(A.class); 
    final Root<A> a = c.from(A.class); 
    a.fetch(A_.details).fetch(D_.modeDetails); 
    a.fetch(A_.childrens); 

    ... 

是否有可能「複合型」的爲孩子們還呼籲?

回答

1

經過太多的搗鼓之後,我發現我還有另一個問題,那就是查詢會返回重複。所以我結束了使用a.join(A_.childrens,JoinType.LEFT).fetch(B_.details) 並使用查詢提示 query.setHint(QueryHints.FETCH,「t1.childrens」) 我設法消除重複並獲取更深層次。