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);
35
demandé sur Radim Köhler 2014-08-28 01:01:53

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.

76
répondu Radim Köhler 2014-08-28 05:32:11

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

3
répondu birya 2014-08-27 21:05:40