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

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.

 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/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

 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/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-08-27 21:05:40