Criterio.ENTIDAD RAÍZ DISTINTA vs Proyecciones.distinto
Soy bastante nuevo en Hibernar. Descubrí que podemos obtener resultados distintos utilizando dos formas diferentes. ¿Podría alguien decirme cuál es la diferencia entre ellos? ¿Cuándo usar uno sobre otro?
Projections.distinct(Projections.property("id"));
Vs
criteria.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);
2 answers
Aunque nombres similares, el uso es diferente.
I. Projections.distinct(Projections.property("id"));
Esta instrucción sería traducida a la instrucción SQL. Se pasará al motor de base de datos y se ejecutará como SQL DISTINCT
. Véase:
Por ejemplo, este ejemplo:
List results = session.createCriteria(Cat.class)
.setProjection( Projections.projectionList()
.add( Projections.distinct(Projections.property("id")) )
)
.list();
Parece como:
SELECT DISTINCT(cat_id) FROM cat_table
II. criteria.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);
Esta declaración se ejecuta ex-post. Una vez que la consulta SQL del motor de base de datos es returned e Hibernate itera el conjunto de resultados para convertirlo en una lista de nuestras entidades.
Pero es necesario siempre? NO, sobre todo esto no es necesario.
El único caso, cuando DEBEMOS utilizar que, si hay una asociación en la consulta - UNIRSE a la
one-to-many
fin.
Porque si tenemos una cat
y sus dos kittens
, esto volvería dos filas, mientras que cat
es sólo uno:
SELECT cat.*, kitten.*
FROM cat_table as cat
INNER JOIN kitten_table kitten ON kitten.cat_id = cat.cat_id
Entonces, la declaración al final del criteriaQuery
:
... // criteriaQuery joining root and some one-to-many
.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY)
Resultaría en una lista con un solo gato.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-08-28 05:32:11
De los documentos: DISTINCT_ROOT_ENTITY Cada fila de resultados es una instancia distinta de la entidad raíz
Distinct () selecciona distinct by property, en su caso by identifier
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-08-27 21:05:40