私はHibernateを初めて使用します。次の2つの異なる方法を使用すると、明確な結果が得られることがわかりました。それらの違いは何ですか?いつ他のものを使用するのですか?
Projections.distinct(Projections.property("id"));
対
criteria.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);
名前は似ていますが、使用方法は異なります。
Projections.distinct(Projections.property("id"));
このステートメントはSQLステートメントに変換されます。 DBエンジンに渡され、SQL DISTINCT
として実行されます。見る:
例えばこの例:
_List results = session.createCriteria(Cat.class)
.setProjection( Projections.projectionList()
.add( Projections.distinct(Projections.property("id")) )
)
.list();
_
次のようになります:
_SELECT DISTINCT(cat_id) FROM cat_table
_
criteria.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);
このステートメントは実行されますex-post。 DBエンジンからSQLクエリが返され、Hibernateが結果セットを繰り返して、エンティティのリストに変換します。
しかし、常に必要ですか?いいえ、ほとんどこれは必要ありません。
クエリに関連付けがある場合、それを使用しなければならない唯一のケース-_
one-to-many
_ endの結合。
1つcat
とその2つkittens
、これはtwo行を返しますが、cat
はのみです1つ:
_SELECT cat.*, kitten.*
FROM cat_table as cat
INNER JOIN kitten_table kitten ON kitten.cat_id = cat.cat_id
_
したがって、criteriaQuery
の最後のステートメント:
_... // criteriaQuery joining root and some one-to-many
.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY)
_
1つの猫のみのリストが作成されます。
ドキュメントから:DISTINCT_ROOT_ENTITY結果の各行は、ルートエンティティの個別のインスタンスです。
distinct()はプロパティごとにdistinctを選択します。この場合、識別子ごとに