簡體   English   中英

Hibernate ManyToMany - 僅返回唯一元素

[英]Hibernate ManyToMany - only return unique elements

我有三張桌子:

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...)

但它感覺有點icky我想在沒有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上實現不涉及'rank'字段的equals()方法。

更新:

好的,正如您之前所說,這不起作用。 我已經做了一些測試,似乎當在一個關聯上定義@LazyCollection時,無論如何都會忽略@Where對此關聯的限制。 在extra-lazy集合上調用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 - 然后在db級別完成過濾。 將實體映射到視圖與表相同。

然后用公司和Person to Employee中的兩個一對多關聯替換你的多對多關系。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM