wake-up-neo.com

Criteria.DISTINCT_ROOT_ENTITY vs Projections.distinct

Ich bin ziemlich neu in Hibernate. Ich fand heraus, dass wir auf zwei verschiedene Arten unterschiedliche Ergebnisse erzielen können. Kann mir jemand sagen, worin der Unterschied besteht? Wann man eins über dem anderen benutzt?

Projections.distinct(Projections.property("id"));

vs

criteria.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);
39
user3123690

Während ähnliche Namen, ist die Verwendung unterschiedlich.

I. Projections.distinct(Projections.property("id"));

diese Anweisung würde in eine SQL-Anweisung übersetzt. Es wird an DB Engine übergeben und als SQL DISTINCT ausgeführt. Sehen:

so z. dieses Beispiel:

List results = session.createCriteria(Cat.class)
    .setProjection( Projections.projectionList()
        .add( Projections.distinct(Projections.property("id")) )
    )
    .list();

würde wie folgt aussehen:

SELECT DISTINCT(cat_id) FROM cat_table

II. criteria.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);

Diese Anweisung wird nachträglich ausgeführt . Sobald die SQL-Abfrage vom DB-Modul zurückgegeben wurde und der Ruhezustand die Ergebnismenge durchläuft, wird diese in eine Liste unserer Entitäten konvertiert.

Aber wird es immer gebraucht? NEIN, meistens wird dies nicht benötigt.

Der einzige Fall, wenn wir das verwenden MÜSSEN, wenn die Abfrage eine Assoziation enthält - JOINING am Ende von one-to-many.

Denn wenn wir einen cat und seine zwei kittens würde dies zwei Zeilen zurückgeben, während cat nur ist eins:

SELECT cat.*, kitten.*
FROM cat_table as cat 
  INNER JOIN kitten_table kitten ON kitten.cat_id = cat.cat_id

Also die Anweisung am Ende des criteriaQuery:

... // criteriaQuery joining root and some one-to-many
.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY)

würde zu einer Liste mit nur einer Katze führen.

80
Radim Köhler

Aus Dokumenten: DISTINCT_ROOT_ENTITY Jede Ergebniszeile ist eine eigene Instanz der Stammentität

distinct () wählt distinct nach Eigenschaft aus, in Ihrem Fall nach Bezeichner

3
birya