2012-05-24 8 views
12

私のデータベースには、テストテーブルがあります。testName、testType 同じタイプの "SUN"の2つのテストがあります。以下のように私の休止状態/基準でDistinctを使用しますが、それでも私は両方とも "sun"と同じ名前の型を与えてくれます。Hibernateの基準でDistinctを追加するには

 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には「型」のみが含まれています。 Testクラスのその他のプロパティはnullまたは0の値を持っています。どのようにしてこれらの値を固有の型の制限と共に得ることができますか? – RAS

1

同じ問題があり、Group By投影を使用して解決してから、必要なすべての列を追加しました。例

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

偉大な答えは、私の場合だけでなく、10の代わりに1つの追加ラインで働いた... – 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

するTry setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY)

基準crit = session.createCriteria(Test.class); リストリスト= crit.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY).list();

関連する問題