9

私はGROUP BY自分の基準で使用しようとしています。私はこれを行う必要があります:

SELECT b FROM Book b GROUP BY volumeCode;

私は次のコードを持っています:

    Criteria c = s.createCriteria(Book.class);
    c.setProjection(Projections.projectionList().add(Projections.groupProperty("volumeCode")));
    List<Book> result = c.list();

ただし、この基準はvolumeCodes (文字列のリスト) のみを返します。s のリストを取得する必要がありますBook。だから私はトランスフォーマーを使用しようとしました:

    Criteria c = s.createCriteria(Book.class);
    c.setProjection(Projections.projectionList().add(Projections.groupProperty("volumeCode")));
    c.setResultTransformer(Transformers.aliasToBean(Book.class));
    List<Book> result = c.list();

このコードは、null 値のリストを返します。基準でそれを行うことは可能ですか?

4

3 に答える 3

7

まず第一に、projecton は取得したデータの量をフィルタリングします。さらに多くのデータが必要な場合は、それらのプロパティも投影に追加する必要があります。

例:

c.setProjection( Projections.projectionList()
    .add( Projections.property("id").as("id") )
    .add( Projections.property("descripction").as("description") )
    .add( Projections.groupProperty("volumeCode").as("volumeCode") ));

これで、トランスフォーマーは「Bean へのエイリアス」と言う処理を実行し、Java Bean「Book.java」のプロパティとエイリアスを一致させます。

編集:

トランスフォーマーがない場合、プロジェクションに複数のプロパティがある場合、結果は次のようになります。

for(Object[] item:criteria.list()){
    System.out.println( (String)item[0] ); //ID
    System.out.println( (String)item[1] ); //Description
    System.out.println( (String)item[2] ); //Volume code
}

そのため、トランスフォーマーについてキャスト例外が発生していました。すべてのエイリアスを Java Bean のプロパティ名と一致させてみてください。

于 2013-05-15T17:42:05.213 に答える
2

私はあなたが使用できると思います:criteria.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);

于 2014-11-20T07:10:28.673 に答える