我有三個表:Hibernate的多對多 - 只返回獨特的元素
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...)
,但感覺有點噁心,我想這樣做不道。
謝謝艾倫。排名不會總是一個。 設定的想法可行,但我不得不變得懶惰。我不會繼續這樣做,因爲它意味着加載1000個Person對象來獲得計數。 – 2012-07-16 13:35:29
@where的另一種方法是定義一個過濾器。這將允許通過啓動和過濾以及在加載時間設置所需參數來實現動態限制,例如,從XYZ where rank =(從員工中選擇min(等級)where company_id =?和person_id =?) – 2012-07-16 13:45:48
好主意,但它意味着我需要做hibernate.shakeMagicStick(fredCo); fredCo.employees.size();這對我來說有點不對勁,不如做companyDao.getEmployeesFor(fredCo)? – 2012-07-17 13:04:18