JPA mappedBy父实体返回的次数与子节点数量相同

时间:2014-01-06 12:22:17

标签: sql spring jpa spring-data-jpa

我用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'对象。所以问题是为什么它返回ParentChild相同的金额?我可以看一下生成的SQL,但只是看到它对我帮助不大。我可以添加其他不同的东西:

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

但是又一次,它没有被优化,因为它首先得到Parent个过多的Child个对象,然后缩小到一个。如果我有1000个Child个对象,那么它会产生1000个Parent个对象,这些对象真的很难。

我确定这是常见的问题,但我找不到任何东西,只有Hibernate特定的答案才能使用FetchType.SUBSELECT,但它没有改变结果。感谢任何帮助,谢谢。

1 个答案:

答案 0 :(得分:2)

使用您描述的DISTINCT关键字而不必担心,因为有效地执行此操作是数据库层的问题。此外,如果查询中没有任何条件(您未显示),则可以考虑删除子项INNER JOIN