Como você faz uma consulta limite em HQL?

No Hibernate 3, existe uma maneira de fazer o equivalente ao seguinte limite do MySQL em HQL?

select * from a_table order by a_table_column desc limit 0, 20; 

Eu não quero usar setMaxResults, se possível. Isso definitivamente era possível na versão mais antiga do Hibernate / HQL, mas parece ter desaparecido.

Isso foi postado no fórum do Hibernate alguns anos atrás, quando perguntado sobre o porquê isso funcionou no Hibernate 2, mas não no Hibernate 3:

O limite nunca foi uma cláusula suportada no HQL. Você está destinado a usar setMaxResults ().

Então, se funcionou no Hibernate 2, parece que foi por coincidência, ao invés de por design. Eu acho que isso foi porque o analisador Hibernate 2 HQL replaceia os bits da consulta que ele reconhecia como HQL, e deixaria o restante como estava, então você poderia esgueirar-se em alguma SQL nativa. O Hibernate 3, no entanto, possui um AST HQL Parser adequado, e é muito menos indulgente.

Eu acho que Query.setMaxResults() é realmente sua única opção.

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

Se você não quiser usar setMaxResults() no object Query , poderá sempre voltar a usar o SQL normal.

Se você não quiser usar setMaxResults, também poderá usar Query.scroll em vez de list e buscar as linhas desejadas. Útil para paginação por exemplo.

String hql = "select userName from AccountInfo order by points desc 5";

Isso funcionou para mim sem usar setmaxResults();

Basta fornecer o valor máximo no último (neste caso, 5) sem usar o limit palavras-chave. : P

Se pode gerenciar um limite neste 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 é um código muito simples para lidar com um limite ou uma lista.

Minha observação é que mesmo você tem limite no HQL (hibernate 3.x), ele estará causando erro de análise ou apenas ignorado. (se você tiver pedido + desc / asc antes do limite, ele será ignorado, se você não tiver desc / asc antes do limite, isso causará erro de análise)

 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()); } 

Você precisa escrever uma consulta nativa, consulte isso .

 @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);