我试图解决的问题是在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。请你澄清以下问题。
提前感谢。
我认为使用Set更好,因为Set不允许元素重复,而且您可以覆盖Company的equals方法,并将其放在当两个元素相等时将要验证的字段上。另一种方法是在setcompanys(上市公司)方法中,您可以在此之前进行一些逻辑处理。公司=公司。流()。独特的()。collect(Collectors.toList());或者这个。公司=新阵列列表
但我面临的问题是,账户中的公司也有重复实体。
除非您将重复的公司
实体分配给同一帐户,否则不应发生这种情况。
在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