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);
Author: Radim Köhler, 2014-08-28

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.

 76
Author: Radim Köhler,
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

 3
Author: birya,
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