Criterios.DISTINCT_ROOT_ENTITY vs Proyecciones.distintas

Soy bastante nuevo para Hibernar. Me enteré de que podemos obtener resultado distinto uso de las siguientes dos maneras diferentes. Podría cualquiera me diga cuál es la diferencia entre ellos? Cuando el uso de uno sobre otro?

Projections.distinct(Projections.property("id"));

vs

criteria.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);
InformationsquelleAutor user3123690 | 2014-08-27

2 Kommentare

  1. 81

    Mientras que nombres similares, el uso es diferente.

    I. Projections.distinct(Projections.property("id"));

    esta declaración que se traduciría en la Instrucción SQL. Se pasará a Motor de base de datos y se ejecuta como un SQL DISTINCT. Ver:

    así, por ejemplo este ejemplo:

    List results = session.createCriteria(Cat.class)
        .setProjection( Projections.projectionList()
            .add( Projections.distinct(Projections.property("id")) )
        )
        .list();

    tendría que parece:

    SELECT DISTINCT(cat_id) FROM cat_table

    II. criteria.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);

    Esta instrucción se ejecuta ex-post. Una vez que la consulta SQL del motor de base de datos se devuelve y de Hibernación, se recorre el conjunto de resultados para convertirlo en la lista de nuestras entidades.

    Pero es necesario siempre? NO, en gran parte, esto no es necesario.

    El único caso, cuando DEBEMOS usar que, si hay una asociación en la consulta – UNIRSE a la one-to-many final.

    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

    Así, la declaración al final de la criteriaQuery:

    ... //criteriaQuery joining root and some one-to-many
    .setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY)

    daría como resultado una lista con solo un gato.

    • Muchas gracias por tu respuesta clara. Está muy bien explicado. Yo casi terminado de leer el Comienzo de Hibernación libro, pero todavía no pude averiguar acerca de los Criterios.DISTINCT_ROOT_ENTITY. Tu respuesta con un ejemplo que me hizo claro.
    • tengo una duda, ¿cómo puede u tomar en el primer ejemplo se devuelve, la clase, y no solo el id, hacer u sabes a qué me refiero? gracias.
    • Podemos utilizar el distintivo de identificación y uso mediante HQL para obtener distintas filas de una clase, creo que no es buena idea en términos de rendimiento, sin embargo.
    • Pero el único gato tiene tanto gatito?
  2. 3

    Desde google docs:
    DISTINCT_ROOT_ENTITY
    Cada fila de resultados es un claro ejemplo de la entidad raíz

    distintos() selecciona distintos de la propiedad, en su caso por el identificador de

    • Gracias por tu respuesta. Entendí segunda línea, pero debido a la falta de conocimiento acerca de la raíz de la entidad, no entendía primera línea completamente. Todavía era muy útil.

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein

Pruebas en línea