java - top - ¿Cómo se hace una consulta de límite en HQL?
hql join two tables (9)
Mi observación es que incluso usted tiene un límite en el HQL (hibernación 3.x), ya sea causando un error de análisis o simplemente se ignorará. (Si tiene orden por + desc / asc antes del límite, se ignorará, si no tiene desc / asc antes del límite, se producirá un error de análisis)
En Hibernate 3, ¿hay una manera de hacer el equivalente del siguiente límite de MySQL en HQL?
select * from a_table order by a_table_column desc limit 0, 20;
No quiero usar setMaxResults si es posible. Esto definitivamente fue posible en la versión anterior de Hibernate / HQL, pero parece haber desaparecido.
Necesita escribir una consulta nativa, consulte this .
@Query(value =
"SELECT * FROM user_metric UM WHERE UM.user_id = :userId AND UM.metric_id = :metricId LIMIT :limit", nativeQuery = true)
List<UserMetricValue> findTopNByUserIdAndMetricId(
@Param("userId") String userId, @Param("metricId") Long metricId,
@Param("limit") int limit);
Si no desea usar setMaxResults()
en el objeto Query
, siempre puede volver a usar el SQL normal.
Si no desea utilizar setMaxResults, también puede usar Query.scroll en lugar de list y obtener las filas que desee. Útil para la paginación, por ejemplo.
Si puede gestionar un límite en este modo
public List<ExampleModel> listExampleModel() {
return listExampleModel(null, null);
}
public List<ExampleModel> listExampleModel(Integer first, Integer count) {
Query tmp = getSession().createQuery("from ExampleModel");
if (first != null)
tmp.setFirstResult(first);
if (count != null)
tmp.setMaxResults(count);
return (List<ExampleModel>)tmp.list();
}
Este es un código realmente simple para manejar un límite o una lista.
Esto se publicó en el foro de Hibernate hace unos años cuando se le preguntó por qué funcionaba en Hibernate 2 pero no en Hibernate 3:
El límite nunca fue una cláusula compatible en HQL. Debes usar setMaxResults ().
Entonces, si funcionó en Hibernate 2, parece que fue por coincidencia, en lugar de por diseño. Creo que esto se debió a que el analizador de HQL de Hibernate 2 reemplazaría los bits de la consulta que reconoció como HQL, y dejaría el resto como estaba, por lo que podría colarse en algún SQL nativo. Hibernate 3, sin embargo, tiene un analizador AST HQL adecuado, y es mucho menos tolerante.
Creo que Query.setMaxResults()
realmente es tu única opción.
String hql = "select userName from AccountInfo order by points desc 5";
Esto funcionó para mí sin usar setmaxResults();
Simplemente proporcione el valor máximo en el último (en este caso 5) sin utilizar el limit
palabras clave. :PAG
// SQL: SELECT * FROM table LIMIT start, maxRows;
Query q = session.createQuery("FROM table");
q.setFirstResult(start);
q.setMaxResults(maxRows);
Criteria criteria=curdSession.createCriteria(DTOCLASS.class).addOrder(Order.desc("feild_name"));
criteria.setMaxResults(3);
List<DTOCLASS> users = (List<DTOCLASS>) criteria.list();
for (DTOCLASS user : users) {
System.out.println(user.getStart());
}