我正在使用Hibernate爲新項目創建一個域模型。我有一個實體,基本上由longName:String
,shortName:String
和otherNames:Collection<String>
組成。Hibernate:使用關聯的findByExample標準
我已經能夠設置這很好,但我現在要上一些DAO功能,將允許用戶通過例如,要查找一個實體的工作,即我應該能夠創建一個實體對象,並設置一些這些字段,那麼當我將它傳遞給搜索時,它應該返回一個匹配已經設置的字段的結果列表。我知道我可以使用Hibernate Example
s來做到這一點。
public List<Entity> findByExample(EntityexampleObject) {
try {
Criteria criteria = getSession().createCriteria(type);
Example example = Example.create(exampleObject).ignoreCase();
criteria.add(example);
@SuppressWarnings("unchecked")
List<Entity> list = criteria.list();
return list;
} catch (HibernateException he) {
return null;
}
}
但是根據我的經驗和文檔,在做這件事時會忽略關聯。所以我爲其他名稱的字符串集合被忽略,因爲它在數據庫中被表示爲關聯(一對多)。
理想情況下,我希望能夠創建實體對象並將otherName
添加到它,然後我將能夠找到任何實體,其中一個otherName
的集合與參數匹配。
我試着這樣做:
SortedSet<String> names = exampleObject.getNames();
if (names != null && !names.isEmpty()) {
Criteria newCriteria = criteria.createCriteria("mappedNames");
newCriteria.add(Restrictions.in("string", exampleObject.getNames()));
}
如果這裏的字符串文本表示在DB中使用的列名。這樣做的作用在於它可以連接表格並返回數據庫中otherName
之一與條件匹配的結果。但是我得到了重複,因爲如果一個實體有兩個其他名稱並且搜索標準正在尋找它們,那麼它們顯示爲兩個結果,因爲聯結創建兩行代表同一個實體,但是與另外兩個名稱中的每一個都相同。例如: -
Entity:
longName:foo
shortName:bar
otherNames:
a
b
將導致兩行的加盟:
foo, bar, a
foo, bar, b
所以,當我做criteria.list它返回兩個實體對象,這兩者是同一個對象。
有沒有人知道通過使用Hibernate進行示例查找的更好方法,其中搜索實際上查看關聯(在本例中,這是關於字符串集合的簡單關聯)?