当前位置: 首页 > 知识库问答 >
问题:

重复JPA和Hibernate实体列表属性中的项目

林俊晖
2023-03-14

我试图解决的问题是在hibernate中避免列表属性中出现重复项。考虑下面的域名。

public class Account
    {
        @OneToMany(fetch = FetchType.LAZY)
        @JoinTable(name = "FI_COMPANY_ACCOUNT", joinColumns = @JoinColumn(name = "ACCOUNT_ID", referencedColumnName = "ID"), inverseJoinColumns = @JoinColumn(name = "COMPANY_ID", referencedColumnName = "ID"))
        private List<Company> companies;

        @OneToMany(fetch = FetchType.LAZY, mappedBy = "account", cascade = CascadeType.ALL, orphanRemoval = true)
        private List<AccountDesc> accountDescList;
    }

public class Company {}

public class AccountDesc
{
    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "PARENT_ID", referencedColumnName = "ID")
    private Account account;
}

我使用标准API获取帐户。在查询中,我使用公司的左连接和帐户DescList属性的内连接执行读取。这有助于我在第一次选择中获得两个属性,并避免进一步选择。

Root<Account> root = criteriaQuery.from(Account.class);
root.fetch("companies", JoinType.LEFT);
root.fetch("accountDescList");

我知道根实体(此处为帐户)可以在结果中重复。我可以用多种方法解决这个问题,比如,http://in.relation.to/2016/08/04/introducing-distinct-pass-through-query-hint/ https://howtoprogramwithjava.com/how-to-fix-duplicate-data-from-hibernate-queries/

但我面临的问题是,账户内的公司也有重复实体。如果accountDescList有多个条目,就会发生这种情况。

要解决属性公司中的重复问题,我觉得唯一的解决方法是使用Set。请你澄清以下问题。

  1. 除了使用Set(针对属性公司)之外,还有其他方法可以解决此问题
  2. 即使我使用can,我也会指示hibernate使用OrderedSetType(它使用LinkedHashSet)。这样我就可以保留从数据库返回的项目的顺序。不幸的是,我没有在OrderBy中使用的属性。我需要数据库返回的默认顺序

提前感谢。

共有2个答案

利俊迈
2023-03-14

我认为使用Set更好,因为Set不允许元素重复,而且您可以覆盖Company的equals方法,并将其放在当两个元素相等时将要验证的字段上。另一种方法是在setcompanys(上市公司)方法中,您可以在此之前进行一些逻辑处理。公司=公司。流()。独特的()。collect(Collectors.toList());或者这个。公司=新阵列列表

松钊
2023-03-14

但我面临的问题是,账户中的公司也有重复实体。

除非您将重复的公司实体分配给同一帐户,否则不应发生这种情况。

在Criteria API查询中使用DISTINCT将删除根重复项。但是,在您的情况下,不值得在两个@OneTo很多关系上使用JOIN FETCH,因为这将导致笛卡尔产品。

一次最多只能获取一个集合,第二个集合可以使用@Subselect获取。

 类似资料:
  • 我有一个使用Postgre 9.3和JPA2.1(Hibernate实现)的Spring MVC应用程序。我有一个类'电影',其中有一组评论。我想写一个JPA NamedQuery,它返回我所有的电影细节,但只有批准的评论。评论可以有其他状态,但我想只显示批准的评论。 我的班级如下所示: 我写的查询不会过滤评论并返回包含所有评论的电影;它的工作原理与上面显示的findMovieById查询相同。

  • 我有一份包含订单项目列表的订单 如果在这个列表中我有以下项目 我想计算订单所有者名称相同的值之和。 e、 g.如果所有者名称为“John”,则返回417.00,如果名称为“Doe”,则返回19.00。 我怎么能通过小溪Java呢?非常感谢

  • //想象所有字段的getter和setter。 我用上面的方法来测试Menuplan是否已经分配了给定的食谱(作为点心或食谱)。 我想知道是否有更优雅/更短的方法来编写函数。

  • 问题内容: 我将MySQL列声明为 JSON 类型,并且在使用Jpa / Hibernate映射时遇到问题。我在后端使用Spring Boot。 这是我的代码的一小部分: 该程序返回一个错误,并告诉我无法映射该列。 在mysql表中,该列定义为: json_value JSON NOT NULL; 问题答案: 我更喜欢这样: 创建从Map到String的转换器(属性转换器),反之亦然。 使用Map

  • 对JPA来说比较新,所以我有一个架构问题。假设我有多对一关系的员工和部门表(即许多员工为一个部门工作): 所以我可以为员工和部门定义合适的实体,没有问题。但是,在一个视图中,我想显示部门列表,其中包含为该部门工作的员工数量,类似于这样: 我只是不确定使用JPA实现这一目标的正确策略是什么。。。我不想总是获取部门实体的员工数量,因为需要时只有一个视图。 看起来HiberNate的@公式是一种可能的方

  • 我有遗产数据库。 表内容有一个PK列。siteId列不是PK的一部分。表程序有两个PK列(siteId、code)。它是复合PK。此表用作模板。程序中唯一的变量是parameter,它位于表内容的prog_param列上。 作为代码 但这不是工作。Hibernate引发“实体映射中重复列”异常。 所以我研究了一些解决方案。最后,我发现这个'Republic column in mapping fo