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);
Während ähnliche Namen, ist die Verwendung unterschiedlich.
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
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.
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