gpt4 book ai didi

java - Hibernate ManyToMany - 只返回唯一元素

转载 作者:行者123 更新时间:2023-12-02 07:41:39 24 4
gpt4 key购买 nike

我有三个表:

Company
id name
1 Fred Co.

Person
id name
1 Fred

Employee
id company_id person_id rank
1 1 1 1
2 1 1 2

现在该排名由不同的应用程序使用,但对于我正在使用的内容,我并不关心它。我想要做的是创建一个 hibernate 映射(通过域模型),它将仅返回唯一的员工。

我目前有

class Person {
@Column(name = "id")
Long id;

@Column(name = "name")
String id;
}

class Company {
@Column(name = "id")
Long id;

@Column(name = "name")
String id;

@ManyToMany(fetch = FetchType.LAZY)
@JoinTable(name = "EMPLOYEE",
joinColumns = { @JoinColumn(name = "COMPANY_ID") },
inverseJoinColumns = { @JoinColumn(name = "PERSON_ID") })
@LazyCollection(LazyCollectionOption.EXTRA)
List<Person> employees = new ArrayList<Person>();
}

但这意味着fredCo.employees.size() == 2。如何过滤以便仅返回唯一的人员?

我想通过域模型来做到这一点。

编辑:虽然上面的示例很小,但在现实生活中,Person 对象非常大,每个公司有 1000 名员工(因此格外懒惰)。

现在我可以(并且已经)得到了

companyDao.getEmployeesFor(Company...)
companyDao.getEmployeeCountFor(Company...)

但是感觉有点恶心,我想不用 Dao 来做。

最佳答案

如果始终设置排名并且第一条记录始终为“1”,那么您可以向映射添加一个简单的 @Where/@WhereJoinTable 子句,将集合限制为排名为 1 的记录。

https://access.redhat.com/knowledge/docs/en-US/JBoss_Enterprise_Application_Platform/5/html/Hibernate_Annotations_Reference_Guide/entity-hibspec-collection.html

另一种方法是将集合更改为 Set,并在 Person 上实现不涉及“排名”字段的 equals() 方法。

更新:

好的,正如您之前所说,这是行不通的。我已经做了一些测试,似乎当在关联上定义 @LazyCollection 时,无论如何都会忽略对此关联的 @Where 限制。对超惰性集合调用 size() 实际上会导致 Hibernate 对数据库发出 count() 查询。不附加附加条款。

为什么@Where应该被忽略我不知道,但这已经在其他地方被查询过并且似乎是一个悬而未决的问题:

https://forum.hibernate.org/viewtopic.php?f=9&t=988631&view=previous

https://hibernate.onjira.com/browse/HHH-3319

我认为您仍然可以通过创建一个附加的 Employee 实体来执行您想要的操作,该实体映射到使用之前的 SQL 内部查询定义的 VIEW - 然后在数据库级别完成过滤。将实体映射到 View 与表相同。

然后将多对多替换为从公司和个人到员工的两个一对多关联。

关于java - Hibernate ManyToMany - 只返回唯一元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11505027/

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