我已經使用了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,但它沒有改變結果。任何幫助表示讚賞,謝謝。
謝謝我會堅持下去,並會比較使用DISTINCT和沒有創建的SQL語句。 – Skyzer