¿Cómo se hace una consulta de límite en HQL?

En Hibernate 3, ¿hay alguna manera de hacer el equivalente al 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.

Esto fue publicado en el foro de Hibernate hace unos años cuando se le preguntó por qué esto funcionó en Hibernate 2 pero no en Hibernate 3:

El límite nunca fue una cláusula compatible en HQL. Está destinado a usar setMaxResults ().

Entonces, si funcionó en Hibernate 2, parece que fue por coincidencia, más que por diseño. Creo que esto se debe a que el analizador de HQL Hibernate 2 reemplazaría los bits de la consulta que reconoció como HQL, y dejaría el rest tal como estaba, para que pueda colarse en algún SQL nativo. Hibernate 3, sin embargo, tiene un AST HQL Parser apropiado, y es mucho menos permisivo.

Creo que Query.setMaxResults() es realmente tu única opción.

  // SQL: SELECT * FROM table LIMIT start, maxRows; Query q = session.createQuery("FROM table"); q.setFirstResult(start); q.setMaxResults(maxRows); 

Si no desea utilizar setMaxResults() en el objeto Query , siempre puede volver a utilizar SQL normal.

Si no desea usar setMaxResults, también puede usar Query.scroll en lugar de list, y buscar las filas que desee. Útil para paginación, por ejemplo.

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 usar el limit palabra clave. :PAG

Mi observación es que incluso si tiene límite en HQL (hibernación 3.x), causará un error de análisis o simplemente lo ignorará. (si tiene orden por + desc / asc antes del límite, será ignorado, si no tiene desc / asc antes del límite, causará error de análisis)

Si puede administrar un límite en este modo

 public List listExampleModel() { return listExampleModel(null, null); } public List 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)tmp.list(); } 

Este es un código realmente simple para manejar un límite o una lista.

 Criteria criteria=curdSession.createCriteria(DTOCLASS.class).addOrder(Order.desc("feild_name")); criteria.setMaxResults(3); List users = (List) criteria.list(); for (DTOCLASS user : users) { System.out.println(user.getStart()); } 

Necesita escribir una consulta nativa, remítalo.

 @Query(value = "SELECT * FROM user_metric UM WHERE UM.user_id = :userId AND UM.metric_id = :metricId LIMIT :limit", nativeQuery = true) List findTopNByUserIdAndMetricId( @Param("userId") String userId, @Param("metricId") Long metricId, @Param("limit") int limit);