Kryteria.Odrębny element ROOT vs projekcje.distinct
Jestem całkiem nowy w hibernacji. Dowiedziałem się, że możemy uzyskać wyraźny wynik, stosując dwa różne sposoby. Czy ktoś mógłby mi powiedzieć, jaka jest różnica między nimi? Kiedy używać jednego nad drugim?
Projections.distinct(Projections.property("id"));
Vs
criteria.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);
2 answers
Podczas gdy podobne nazwy, użycie jest inne.
I. Projections.distinct(Projections.property("id"));
To polecenie zostanie przetłumaczone na polecenie SQL. Zostanie on przekazany do silnika DB i wykonany jako SQL DISTINCT
. Zobacz:
Więc np. ten przykład:
List results = session.createCriteria(Cat.class)
.setProjection( Projections.projectionList()
.add( Projections.distinct(Projections.property("id")) )
)
.list();
Wydaje się:
SELECT DISTINCT(cat_id) FROM cat_table
II. criteria.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);
To oświadczenie jest wykonywane ex-post . Gdy zapytanie SQL z silnika DB jest returned i Hibernate iteruje wynik ustawiony, aby przekonwertować go na listę naszych podmiotów.
Ale czy jest to zawsze potrzebne? Nie, w większości nie jest to potrzebne.
Jedyny przypadek, kiedy musimy go użyć, jeśli w zapytaniu jest skojarzenie-dołączenie końca
one-to-many
.
Ponieważ jeśli mamy cat
i jego dwie kittens
, to zwróci dwa wiersze, podczas gdy cat
jest tylko jeden:
SELECT cat.*, kitten.*
FROM cat_table as cat
INNER JOIN kitten_table kitten ON kitten.cat_id = cat.cat_id
Tak więc stwierdzenie na końcu criteriaQuery
:
... // criteriaQuery joining root and some one-to-many
.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY)
Spowodowałoby powstanie listy z tylko jednym kotem.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-08-28 05:32:11
From docs: DISTINCT_ROOT_ENTITY Każdy wiersz wyników jest odrębną instancją Jednostki Głównej
Distinct () wybiera distinct przez właściwość, w Twoim przypadku przez identyfikator
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-08-27 21:05:40