Sql JPA mappedBy父实体返回的金额是子实体的数倍
我在谷歌上搜索过,但没有找到正确的答案。我使用JPA和Spring数据JPA。我已将父表映射到子表,其中联接列位于子表中。因此,在我的父表中有一个引用mappedBy,我对父实体执行JPA查询,它不是只返回1,而是返回尽可能多的子实体。下面是一个例子: 我的桌子非常简单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
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();
因此,通过上面的查询,我得到了一个包含3Parent
对象的集合,而不是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();