【问题标题】:JPA/Hibernate duplicate recordsJPA/Hibernate 重复记录
【发布时间】:2013-04-26 19:46:29
【问题描述】:

我在实体之间有一对多的关系。执行此 JPQL 查询时:

SELECT parent FROM Parent parent JOIN parent.child child WHERE ...

当父母有 2 个孩子时,我得到重复的记录,当父母有一个孩子时只有一个,没有孩子时没有(没有孩子时没有)。请注意,SQL 数据库中没有 Parent 的重复项。

实体声明如下:

@Entity(...)
public class Parent {

    @Id
    Long parentId;

    @OneToMany(mappedBy = "parentID")
    List<Child> children;
}

@Entity(...)
public class Child {a

    Long parentId;
}

为了简洁起见,我省略了很多代码,但这应该让您对我正在尝试做的事情有一个深刻的了解。请注意,该关系是在父母一方定义的,因为我需要从查询返回的父母名单及其子女。

【问题讨论】:

  • 如果您通过编辑帖子在帖子末尾添加一个问题会很好
  • 你是如何坚持的?具有级联的父级和子级持久化还是分别持久化每个实体。这会澄清很多事情。
  • Freakyuser,我认为很明显我的问题是我的查询中有重复项。
  • 它被持久化在数据库中,子节点有一个指向父表的外键,使用父表的主键。

标签: hibernate jpa duplicates


【解决方案1】:

您可以使用DISTINCT 关键字去除重复项:

SELECT DISTINCT parent FROM Parent parent JOIN parent.child child WHERE ...

编辑:DISTINCT 关键字用于从查询结果中删除重复项,无论这些重复项存在的原因如何。有时原因是重复的数据库条目。但更多情况下,重复是 JOIN 语句的结果,因此您的用例是完全合法的。

但是,您可以通过使关系双向来避免显式连接和DISTINCT 关键字。然后你可以通过导航使用隐式连接:

SELECT parent FROM Parent parent WHERE parent.children...

【讨论】:

  • 谢谢,它有效,但我认为 DISTINCT 关键字是为了消除数据库中存在的重复项,而不是查询生成的重复项。
  • @user2343647 - 不客气 :) 我添加了更多信息 - 请查看编辑
猜你喜欢
  • 2014-11-19
  • 1970-01-01
  • 2023-03-10
  • 1970-01-01
  • 2015-09-13
  • 2019-02-09
  • 1970-01-01
  • 2015-01-21
  • 2011-03-19
相关资源
最近更新 更多