2014-01-06 60 views
0

我已經使用了Google,但沒有找到正確的答案。我使用JPA和Spring Data JPA。我已經將父表映射到子表,其中連接列位於子表中。所以在我的父表中有一個引用mappedBy,我做JPA查詢爲父實體,而不是它返回只有1,它會返回儘可能多的子實體。下面是例子:JPA mappedBy父實體多次返回與孩子相同的金額

我的表格非常簡單

Parent 

| ID |  COLUMN_A | 
|----|----------------| 
| 1 | Column A value | 

Child 
| ID | CHILD_COLUMN_A | PARENT_ID | 
|----|------------------|-----------| 
| 1 | Child column A 1 |   1 | 
| 2 | Child column A 2 |   1 | 
| 3 | Child column A 3 |   1 | 

本地查詢我這樣做的回報我想要什麼
SELECT * FROM parent p INNER JOIN child c ON p.id = c.parent_id

| ID | CHILD_COLUMN_A | PARENT_ID | 
|----|------------------|-----------| 
| 1 | Child column A 1 |   1 | 
| 2 | Child column A 2 |   1 | 
| 3 | Child column A 3 |   1 | 

我的實體映射是以下:

@Entity 
@Table(name = "parent") 
public class Parent implements Serializable{ 
    ... 
    @OneToMany(mappedBy="parent", cascade = CascadeType.PERSIST) 
    List<child> children = new ArrayList<>(); 
     ... 
} 

@Entity 
@Table(name = "child") 
public class Child implements Serializable{ 
    ... 
    @ManyToOne 
    @JoinColumn(name = "parent_id") 
    private Parent parent; 
     .... 
} 

在ParentRepository類我的註釋查詢如下:

@Query("SELECT p FROM Parent p INNER JOIN FETCH p.children c") 
public Collection<Parent> getAll(); 

因此,與上面的查詢我得到返回一個集合, Parent的對象,而不是1!並且在每個Parent對象中正確地應該有3個'Child'對象。所以問題是爲什麼它會返回Parent相同的數量,因爲它有Child呢?我可以查看生成的SQL,但僅僅通過查看它並沒有多大幫助。其他的事情,我可以添加不同:

SELECT DISTINCT p FROM Parent p INNER JOIN FETCH p.children c

但話又說回來,這不是最佳,因爲它首先獲取過多Parent對象與Child,然後逐步下降到一個。如果我有1000個物體,那麼它會產生1000個物體,而這些物體真的是太難以應付了。

我確定這是常見的問題,但我找不到任何東西,只有Hibernate的具體答案使用FetchType.SUBSELECT,但它沒有改變結果。任何幫助表示讚賞,謝謝。

回答

1

正如您所描述的那樣使用DISTINCT關鍵字,而不必擔心,因爲數據庫層的問題是有效的。此外,如果您在查詢中沒有任何條件(您未顯示),則可以考慮刪除子項INNER JOIN

+0

謝謝我會堅持下去,並會比較使用DISTINCT和沒有創建的SQL語句。 – Skyzer