Critère.Entité racine distincte contre Projections.distinct
je suis assez nouveau à hiberner. J'ai découvert que nous pouvons obtenir un résultat distinct en utilisant deux façons différentes. Pouvait-on me dire quelle est la différence entre eux? Quand utiliser l'un sur l'autre?
Projections.distinct(Projections.property("id"));
vs
criteria.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);
2 réponses
bien que des noms similaires, l'usage est différent.
I. Projections.distinct(Projections.property("id"));
cette déclaration serait traduite en déclaration SQL. Il sera passé à DB Engine et exécuté comme un SQL DISTINCT
. Voir:
ainsi, par exemple, cet exemple:
List results = session.createCriteria(Cat.class)
.setProjection( Projections.projectionList()
.add( Projections.distinct(Projections.property("id")) )
)
.list();
semble comme:
SELECT DISTINCT(cat_id) FROM cat_table
II. criteria.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);
cette déclaration est exécutée ex-post . Une fois que la requête SQL de DB engine est retournée et Hibernate itère le jeu de résultats pour la convertir en liste de nos entités.
Mais est-il toujours nécessaire? Non, la plupart du temps, ce n'est pas nécessaire.
le seul cas, quand nous devons utiliser cela, s'il y a une association dans le requête-rejoindre la fin
one-to-many
.
parce que si nous avons un cat
et ses deux kittens
, cela retournerait deux" lignes 1519320920", tandis que cat
est seulement un:
SELECT cat.*, kitten.*
FROM cat_table as cat
INNER JOIN kitten_table kitten ON kitten.cat_id = cat.cat_id
ainsi, la déclaration à la fin du criteriaQuery
:
... // criteriaQuery joining root and some one-to-many
.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY)
entraînerait une liste avec seulement l'un chat.
de docs: DISTINCT_ROOT_ENTITY Chaque ligne de résultats est une instance distincte de l'entité racine
distinct() sélectionne distinct par propriété ,dans votre cas par identifiant