【发布时间】:2018-11-24 01:37:52
【问题描述】:
我要解决的问题是避免休眠中列表属性内的重复项。 考虑以下域。
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");
我知道根实体(此处为 Account)可以在结果中重复。我可以使用多种方式解决问题,例如, 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。能否请您澄清以下问题。
- 除了使用 Set(用于属性公司)之外,还有其他方法可以解决此问题。
- 即使我使用,我也可以指示休眠使用 OrderedSetType(它使用 LinkedHashSet)。这样我就可以保留从数据库返回的项目的顺序。不幸的是,我没有在 OrderBy 中使用的属性。我需要数据库返回的任何默认顺序。
提前致谢。
【问题讨论】: