Sql JPA mappedBy父实体返回的金额是子实体的数倍

Sql JPA mappedBy父实体返回的金额是子实体的数倍,sql,spring,jpa,spring-data-jpa,Sql,Spring,Jpa,Spring Data Jpa,我在谷歌上搜索过,但没有找到正确的答案。我使用JPA和Spring数据JPA。我已将父表映射到子表,其中联接列位于子表中。因此,在我的父表中有一个引用mappedBy,我对父实体执行JPA查询,它不是只返回1,而是返回尽可能多的子实体。下面是一个例子: 我的桌子非常简单 Parent | ID | COLUMN_A | |----|----------------| | 1 | Column A value | 我执行的本机查询返回我想要的内容: 在p.id=c.pare

我在谷歌上搜索过,但没有找到正确的答案。我使用JPA和Spring数据JPA。我已将父表映射到子表,其中联接列位于子表中。因此,在我的父表中有一个引用mappedBy,我对父实体执行JPA查询,它不是只返回1,而是返回尽可能多的子实体。下面是一个例子:

我的桌子非常简单

Parent

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

我执行的本机查询返回我想要的内容:
在p.id=c.parent\u id上选择*从父p内部连接子c

| 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<>();
        ...
}
ParentRepository类中我的带注释查询如下所示:

@Query("SELECT p FROM Parent p INNER JOIN FETCH p.children c")
public Collection<Parent> getAll();
@Query(“从父级p内部连接获取p.children c中选择p”)
公共集合getAll();
因此,通过上面的查询,我得到了一个包含3
Parent
对象的集合,而不是1!在每一个父对象中,都有3个正确的子对象。所以问题是为什么它返回的
Parent
和它的
Child
一样多?我可以查看生成的SQL,但仅仅看到它对我没有多大帮助。我还可以添加其他不同的内容:

选择不同于父p的p内部连接获取p.children c

但是,同样,它没有得到优化,因为它首先得到了过多的
父对象和
子对象,然后缩小到一个。如果我有1000个
Child
对象,那么它将产生1000个
Parent
对象,这将是非常巨大的


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

请使用您描述的
DISTINCT
关键字,不要担心,因为有效地这样做是数据库层的问题。此外,如果您在查询中没有任何条件(您没有显示),您可以考虑删除“<代码>内部连接< /代码>”。

谢谢。我会坚持下去,并将用不同的和不创建的SQL语句进行比较。
@Entity
@Table(name = "child")
public class Child implements Serializable{
    ...
    @ManyToOne
    @JoinColumn(name = "parent_id")
    private Parent parent;
        ....
}
@Query("SELECT p FROM Parent p INNER JOIN FETCH p.children c")
public Collection<Parent> getAll();