2012-05-24 17 views
12

在我的數據庫中我有一個測試表,列:testName,testType 有兩個不同的測試,相同類型即「太陽」,所以我只想要其中一個我爲此在我的hibernate/criteria中使用Distinct如下,但它仍然給我兩個與「sun」同名的類型。如何添加獨特的休眠條件

 Criteria crit = session.createCriteria(Test.class); 

    final ResultTransformer trans = new DistinctRootEntityResultTransformer(); 
    crit.setResultTransformer(trans); 
    List rsList = trans.transformList(crit.list()); 

任何想法可能是什麼原因,或任何其他方式的重複過濾。

回答

22

使用Projections.distinct。

Criteria crit = session.createCriteria(Test.class).setProjection(
    Projections.distinct(Projections.projectionList() 
    .add(Projections.property("type"), "type")) 
.setResultTransformer(Transformers.aliasToBean(YourBean.class)); 

List lst = crit.list(); 

其中YourBean.class有一個屬性「type」。返回的列表將是List<YourBean>

+0

謝謝,現在它給出了正確的結果,但它的形式是在這個語句之後的一個字符串,而我想要完整的對象並返回完整的對象,我也想得到testname的值,我怎麼能得到那個 – user1226162

+0

我編輯了答案以返回對象列表。 – Dandy

+5

@Dandy,提供了很好的答案,但我仍然遇到問題。我得到的bean只包含「type」。 Test類的其他屬性具有null或0值。我如何獲得這些值以及唯一類型限制。 – RAS

1

有同樣的問題,並最終解決使用投影組,然後加入我需要的所有列。例如

Criteria query = session.createCriteria(Class.class) 
    .setProjection(Projections.projectionList() 
     .add(Projections.groupProperty("Col1"), "Col1") 
     .add(Projections.groupProperty("Col2"), "Col2")) 
    .setResultTransformer(Transformers.aliasToBean(Class.class)); 
List list = query.list(); 
4

我終於找到了讓其他列的值:

Criteria criteria = session.createCriteria(Test.class); 
ProjectionList projectionList = Projections.projectionList(); 
ProjectionList projectionList2 = Projections.projectionList(); 
projectionList2.add(Projections.distinct(projectionList.add(Projections.property("distinctColumn"), "distinctColumn"))); 
projectionList2.add(Projections.property("col1"), "col1"); 
projectionList2.add(Projections.property("col2"), "col2"); 
criteria.setProjection(projectionList2); 
criteria.setResultTransformer(Transformers.aliasToBean(Test.class)); 
List list = criteria.list(); 
10

嘗試使用:

cr.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY); 

它完美地爲我工作

+1

你可以添加更多關於它爲什麼適合你的信息嗎? –

+0

偉大的答案,爲我的情況以及只有1個額外的行(而不是10 ...) – argh

+2

這是相當有限的解決方案。當使用ResultTransformer時,hibernate在SQL查詢中不包含DISTINCT,所以我們陷入尋呼(限制/偏移) – Eugene

0

嘗試使用:

Criteria criteria = 
    session.createCriteria(Test.class).setProjection(
     Projections.distinct(Projections.property("testType"))); 
List<Test> rsList = criteria.list(); 
0

嘗試setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY)

Criteria crit = session.createCriteria(Test.class); List list = crit.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY).list();