gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 07:43:25 24 4
gpt4 key购买 nike

我要解决的问题是避免 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;
}

我使用 Criteria API 来获取帐户。在查询中,我对公司使用左连接执行提取,对 accountDescList 属性使用内部连接。这有助于我在第一次选择时获得这两个属性,从而避免进一步选择。

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 i instruct hibernate to use OrderedSetType(它使用 LinkedHashSet)。这样我就可以保留从数据库返回的项目的顺序。不幸的是,我没有要在 OrderBy 中使用的属性。我需要数据库返回的任何默认顺序。

提前致谢。

最佳答案

But the issue I face is the attribute companies inside the Account has also duplicate entities.

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

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

您应该一次最多获取一个集合,并且可以使用 @Subselect 获取第二个集合。

关于java - JPA 和 Hibernate 实体的列表属性中的重复项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53454460/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com