Hay una manera para crear una consulta Distinct en HQL. Ya sea mediante el uso de la «distinta de la» palabra clave o algún otro método. No estoy seguro de si distinta es válido keywork para HQL, pero estoy buscando el HQL equivalente de la palabra clave de SQL «distinto».

InformationsquelleAutor Mike Pone | 2008-11-04

9 Comentarios

  1. 121

    He aquí un fragmento de hql que vamos a utilizar. (Los nombres han sido cambiados para proteger la identidad)

    String queryString = "select distinct f from Foo f inner join foo.bars as b" +
                    " where f.creationDate >= ? and f.creationDate < ? and b.bar = ?";
            return getHibernateTemplate().find(queryString, new Object[] {startDate, endDate, bar});
    • que no funciona en mssql, cuando los tipos de texto son los involucrados
    • Yo sólo he usado nunca hibernate con MySQL – no estoy seguro de cómo lidiar con el mssql problema.
  2. 53

    Vale la pena señalar que el distinct palabra clave en HQL no se asignan directamente a la distinct palabra clave en SQL.

    Si utiliza el distinct palabra clave en HQL, entonces, a veces, Hibernate utiliza el distinct palabra clave de SQL, pero en algunas situaciones se utilizará un resultado transformador para producir distintos resultados. Por ejemplo cuando se utiliza una combinación externa como este:

    select distinct o from Order o left join fetch o.lineItems

    No es posible filtrar los duplicados en el nivel de SQL, en este caso, por lo que Hibernate utiliza un ResultTransformer para filtrar los duplicados después de la consulta SQL que se ha realizado.

  3. 16

    hacer algo como esto la próxima vez que

     Criteria crit = (Criteria) session.
                      createCriteria(SomeClass.class).
                      setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);
    
     List claz = crit.list();
    • Eso es subóptima: en lugar de descartar las repeticiones en el nivel de base de datos, se acaba de extraer los datos de la base de datos a la memoria con las repeticiones y todo, y luego descartar las repeticiones después, dependiendo de la frecuencia de los datos se repite, que pueden aumentar las operaciones de e/S bastante.
  4. 9

    También puede utilizar Criteria.DISTINCT_ROOT_ENTITY con Hibernate consulta HQL así.

    Ejemplo:

    Query query = getSession().createQuery("from java_pojo_name");
    query.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);
    return query.list();
    • Eso es subóptima: en lugar de descartar las repeticiones en el nivel de base de datos, se acaba de extraer los datos de la base de datos a la memoria con las repeticiones y todo, y luego descartar las repeticiones después, dependiendo de la frecuencia de los datos se repite, que pueden aumentar las operaciones de e/S bastante.
  5. 4

    Tuve algunos problemas con el resultado de los transformadores combinados con consultas HQL. Cuando traté de

    final ResultTransformer trans = new DistinctRootEntityResultTransformer();
    qry.setResultTransformer(trans);

    no funcionó. He tenido que transformar de forma manual como este:

    final List found = trans.transformList(qry.list());

    Con los Criterios de la API de transformadores funcionado bien.

    • para llegar a 10k (:
  6. 3

    Mi consulta principal se veía así en el modelo:

    @NamedQuery(name = "getAllCentralFinancialAgencyAccountCd", 
        query = "select distinct i from CentralFinancialAgencyAccountCd i")

    Y aún no estaba consiguiendo lo que consideran «diferentes» de los resultados. Eran apenas diferenciado basado en una clave principal de combinación en la tabla.

    Por lo que en el DaoImpl he añadido un cambio de línea y terminó siendo el «distinta de la» vuelta que yo quería. Un ejemplo sería que en lugar de ver 00 cuatro veces yo ahora acabo de ver una vez. Aquí está el código que he añadido a la DaoImpl:

    @SuppressWarnings("unchecked")
    public List<CacheModelBase> getAllCodes() {
    
        Session session = (Session) entityManager.getDelegate();
        org.hibernate.Query q = session.getNamedQuery("getAllCentralFinancialAgencyAccountCd");
        q.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY); //This is the one line I had to add to make it do a more distinct query.
        List<CacheModelBase> codes;
        codes = q.list();
        return codes;       
    }

    Espero que esto ayudó! Una vez más, esto sólo puede funcionar si usted está siguiendo las prácticas de codificación que implementar el servicio, dao, y el tipo de modelo de proyecto.

  7. 2

    Supongamos que usted tiene un Cliente de la Entidad asigna a CUSTOMER_INFORMATION mesa y desea obtener la lista de distinto nombre del cliente. Puede utilizar el siguiente fragmento de código para obtener el mismo.

    Query distinctFirstName = session.createQuery("select ci.firstName from Customer ci group by ci.firstName");
    Object [] firstNamesRows = distinctFirstName.list();

    Espero te sirva de ayuda. Así que aquí estamos con el grupo por lugar de utilizar la palabra clave distinct.

    También anteriormente me pareció difícil el uso de la palabra clave distinct cuando quiero aplicar a varias columnas. Por ejemplo yo quiero de obtener la lista de los distintos firstName, lastName, a continuación, grupo por simplemente trabajo. Tuve dificultad en el uso distinto en este caso.

  8. 1

    Tengo una respuesta para la Consulta de Hibernate Lenguaje a utilizar Distintos campos.
    Puede utilizar *SELECT DISTINCT(TO_CITY) DE FLIGHT_ROUTE*.
    Si utiliza SQL consulta, devuelve la Cadena de la Lista. Usted no puede utilizar el valor de retorno por la Clase de Entidad.
    Así que la Respuesta para resolver este tipo de Problema es el uso de HQL con SQL.

    FROM FLIGHT_ROUTE F WHERE F.ROUTE_ID IN (SELECT SF.ROUTE_ID FROM FLIGHT_ROUTE SF GROUP BY SF.TO_CITY);

    De SQL instrucción de consulta consiguió DISTINTOS ROUTE_ID y de entrada como una Lista.
    Y EN el filtro de consulta de las distintas TO_CITY de (Lista).

    Tipo de retorno es el Bean de Entidad tipo.
    Así que usted puede en AJAX como AutoComplement.

    Todos puedan ACEPTAR

  9. 1

    Puede que la palabra clave distinct en que los criterios de generador como este.

    CriteriaBuilder builder = session.getCriteriaBuilder();
    CriteriaQuery<Orders> query = builder.createQuery(Orders.class);
    Root<Orders> root = query.from(Orders.class);
    query.distinct(true).multiselect(root.get("cust_email").as(String.class));

    Y crear el campo constructor en la clase del modelo.

Dejar respuesta

Please enter your comment!
Please enter your name here