26

私のデータベースには、次の列を持つTestテーブルがあります:testName、testTypeには、同じタイプ、つまり「SUN」の2つの異なるテストがあります。それはまだ「太陽」と同じ名前の両方のタイプを私に与えています。

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

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

理由が何であるか、または重複をフィルタリングする他の方法。

4

8 に答える 8

31

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>

于 2012-05-24T05:55:49.847 に答える
23

使用してみてください:

cr.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);

それは私にとって完璧に機能します

于 2015-05-21T14:56:06.533 に答える
5

私は最終的に他の列の値を取得することを発見しました:

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();
于 2013-03-11T07:08:27.087 に答える
3

同じ問題があり、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();
于 2013-03-06T22:36:57.380 に答える
0

プロジェクションは、マークされたプロパティの結果のみを提供します。ただし、子エンティティに問題が生じます。私が直面した実際の問題については、私の投稿を参照してください。

Hibernate: 親子関係のデータ構造

于 2014-01-22T22:51:09.293 に答える