我用Google搜索但未找到正确的答案。我使用JPA和Spring Data JPA。我已将父表映射到子表,其中连接列位于子表中。所以在我的父表中有一个引用mappedBy,我为父实体执行JPA查询,而不是只返回1,它返回的子数与子实体一样多。这是一个例子:
我的表非常简化
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();
因此,通过上述查询,我返回了一个包含 3 Parent
个对象的Collection,而不是1个!并且在每个Parent对象中都是正确的3'Child'对象。所以问题是为什么它返回Parent
与Child
相同的金额?我可以看一下生成的SQL,但只是看到它对我帮助不大。我可以添加其他不同的东西:
SELECT DISTINCT p FROM Parent p INNER JOIN FETCH p.children c
但是又一次,它没有被优化,因为它首先得到Parent
个过多的Child
个对象,然后缩小到一个。如果我有1000个Child
个对象,那么它会产生1000个Parent
个对象,这些对象真的很难。
我确定这是常见的问题,但我找不到任何东西,只有Hibernate特定的答案才能使用FetchType.SUBSELECT,但它没有改变结果。感谢任何帮助,谢谢。
答案 0 :(得分:2)
使用您描述的DISTINCT
关键字而不必担心,因为有效地执行此操作是数据库层的问题。此外,如果查询中没有任何条件(您未显示),则可以考虑删除子项INNER JOIN
。