2012-02-10 34 views
3

我正在使用Hibernate爲新項目創建一個域模型。我有一個實體,基本上由longName:String,shortName:StringotherNames: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進行示例查找的更好方法,其中搜索實際上查看關聯(在本例中,這是關於字符串集合的簡單關聯)?

回答

1

我想我自己找到了答案,至少在它對我有用的地方。我仍然有興趣在其他輸入,但到目前爲止,這是我做過什麼:

criteria.setResultTransformer(DistinctRootEntityResultTransformer.INSTANCE); 

這告訴它返回不同的實體,在任何表連接的情況下,只返回根實體。