Cómo crear una consulta distinta en HQL


Hay una manera de crear una consulta Distinta en HQL. Ya sea usando la palabra clave "distinct" o algún otro método. No estoy seguro de si distinct es un keywork válido para HQL, pero estoy buscando el equivalente HQL de la palabra clave SQL "distinct".

Author: Mike Pone, 2008-11-05

9 answers

Aquí hay un fragmento de hql que usamos. (Los nombres se han cambiado para proteger las identidades)

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});
 117
Author: Feet,
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
2008-11-04 23:25:10

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

Si usa la palabra clave distinct en HQL, a veces Hibernate usará la palabra clave distinct SQL, pero en algunas situaciones usará un transformador de resultados para producir resultados distintos. Por ejemplo, cuando está utilizando una unión externa como esta:

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

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

 49
Author: Daniel Alexiuc,
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
2016-08-17 15:12:07

Haga algo como esto la próxima vez

 Criteria crit = (Criteria) session.
                  createCriteria(SomeClass.class).
                  setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);

 List claz = crit.list();
 16
Author: Michael,
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
2012-06-28 15:01:32

También puede usar Criteria.DISTINCT_ROOT_ENTITY con Hibernate HQL query también.

Ejemplo:

Query query = getSession().createQuery("from java_pojo_name");
query.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);
return query.list();
 9
Author: aadi53,
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
2016-08-17 15:13:42

Tuve algunos problemas con los transformadores de resultados combinados con consultas HQL. Cuando intenté

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

No funcionó. Tuve que transformarme manualmente así:

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

Con los transformadores API de criterios funcionó muy bien.

 4
Author: Tadeusz Kopec,
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
2009-05-28 10:52:20

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

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

Y todavía no estaba obteniendo lo que consideraba resultados "distintos". Solo eran distintos basados en una combinación de teclas primaria en la mesa.

Así que en el DaoImpl agregué un cambio de línea y terminé obteniendo el retorno "distinto" que quería. Un ejemplo sería en lugar de ver 00 cuatro veces ahora solo lo veo una vez. Aquí está el código que agregué a 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 podría solo funciona si está siguiendo prácticas de codificación que implementan el tipo de proyecto de servicio, dao y modelo.

 3
Author: Nathan Mitchell,
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
2016-08-17 15:17:15

Supongamos que tiene una Entidad de Cliente asignada a la tabla CUSTOMER_INFORMATION y desea obtener una lista de nombre de cliente distinto. Puedes usar el siguiente fragmento para obtener lo mismo.

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

Espero que ayude. Así que aquí estamos usando grupo por en lugar de utilizar la palabra clave distinta.

También anteriormente me resultaba difícil usar una palabra clave distinta cuando quiero aplicarla a varias columnas. Por ejemplo, quiero obtener una lista de FirstName distinto, LastName y luego agrupar por simplemente funcionaría. Me tuvo dificultad en usar distinct en este caso.

 1
Author: chammu,
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
2015-05-12 14:53:28

Tengo una respuesta para Hibernate Query Language para usar campos distintos. Puede usar * SELECT DISTINCT (TO_CITY) DE FLIGHT_ROUTE*. Si utiliza la consulta SQL , devuelve la lista de cadenas. No se puede utilizar devuelve valor por Clase de Entidad. Así que la respuesta para resolver ese tipo de problema es usar HQLcon SQL.

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

De la instrucción de consulta SQL obtuvo ROUTE_ID y entrada DISTINTOS como una Lista. Y EN query filtra el TO_CITY distinto de IN (List).

Volver type es tipo de entidad Bean. Así que puedes hacerlo en AJAX como AutoComplement .

Puede que todo esté bien

 0
Author: San Lin Naing,
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
2013-02-22 13:50:26

Puedes usar la palabra clave distintiva en tu generador de criterios de esta manera.

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 cree el constructor de campos en su clase model.

 0
Author: Santosh Singh,
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
2018-08-21 20:10:28