No Hibernate 3, existe uma maneira de fazer o equivalente ao seguinte limite do MySQL no HQL?
select * from a_table order by a_table_column desc limit 0, 20;
Não quero usar setMaxResults, se possível. Definitivamente, isso foi possível na versão mais antiga do Hibernate / HQL, mas parece ter desaparecido.
java
hibernate
hql
hibernate3
stevedbrown
fonte
fonte
Hibernate-5.0.12
. Isso ainda não está disponível? Seria muito pesado obter um milhão de registros e, em seguida, aplicar o filtro sobre elesetMaxResults
, como observado por Rachel na resposta de @skaffman.Respostas:
Isso foi postado no fórum do Hibernate alguns anos atrás, quando perguntado sobre por que isso funcionou no Hibernate 2, mas não no Hibernate 3:
Portanto, se funcionou no Hibernate 2, parece que foi por coincidência, e não por design. Eu acho que isso ocorreu porque o analisador Hibernate 2 HQL substituiria os bits da consulta que reconhecia como HQL e deixaria o restante como estava, para que você pudesse esgueirar-se em algum SQL nativo. O Hibernate 3, no entanto, possui um Analisador AST HQL adequado, e é muito menos tolerante.
Eu acho que
Query.setMaxResults()
realmente é sua única opção.fonte
setMaxResults
que pegaria um número limitado de linhas de resultados do conjunto de resultados e exibia para o usuário; no meu caso, tenho 3 milhões de registros consultados e, em seguida, estou chamando setMaxResults para definir 50 registros, mas eu não quero fazer isso, enquanto a própria consulta eu quero consultar 50 registros, existe uma maneira de fazer isso?setMaxResults
hibernate acrescentará alimit
parte à consulta. Não obterá todos os resultados. Você pode verificar a consulta que ela produz, ativando:<property name="show_sql">true</property>
fonte
setFirstResult
é realmente mencionado nesta resposta, enquanto aqui e em outros lugares eles apenas dizemsetMaxResults
isso esetMaxResults
aquilo sem mencionar como definir o deslocamento.Se você não quiser usar
setMaxResults()
oQuery
objeto, poderá sempre voltar a usar o SQL normal.fonte
Se você não quiser usar o setMaxResults, também poderá usar o Query.scroll em vez da lista e buscar as linhas que desejar. Útil para paginação, por exemplo.
fonte
setMaxResults()
carrega primeiro todos os registros na memória e depois cria uma sub-lista, que quando há centenas de milhares ou mais de registros trava o servidor, porque está sem memória. No entanto, eu poderia passar de uma consulta do tipo JPA para uma consulta do HibernateQueryImpl hibernateQuery = query.unwrap(QueryImpl.class)
e, em seguida, poderia usar oscroll()
método conforme sugerido.Você pode facilmente usar a paginação para isso.
você precisa passar
new PageRequest(0, 1)
para buscar registros e da lista buscar o primeiro registro.fonte
Os métodos
setFirstResult
esetMaxResults
Query
Para uma JPA e Hibernate
Query
, osetFirstResult
método é equivalente aeOFFSET
osetMaxResults
método é equivalente a LIMIT:A
LimitHandler
abstraçãoO Hibernate
LimitHandler
define a lógica de paginação específica do banco de dados e, conforme ilustrado no diagrama a seguir, o Hibernate suporta muitas opções de paginação específicas do banco de dados:Agora, dependendo do sistema de banco de dados relacional subjacente que você estiver usando, a consulta JPQL acima usará a sintaxe de paginação apropriada.
MySQL
PostgreSQL
servidor SQL
Oráculo
A vantagem de usar
setFirstResult
esetMaxResults
é que o Hibernate pode gerar a sintaxe de paginação específica do banco de dados para qualquer banco de dados relacional suportado.E você não está limitado apenas às consultas JPQL. Você pode usar o método
setFirstResult
esetMaxResults
sete para consultas SQL nativas.Consultas SQL nativas
Você não precisa codificar a paginação específica do banco de dados ao usar consultas SQL nativas. O Hibernate pode adicionar isso às suas consultas.
Portanto, se você estiver executando esta consulta SQL no PostgreSQL:
O Hibernate irá transformá-lo da seguinte maneira:
Legal certo?
Além da paginação baseada em SQL
A paginação é boa quando você pode indexar os critérios de filtragem e classificação. Se seus requisitos de paginação implicam filtragem dinâmica, é uma abordagem muito melhor usar uma solução de índice invertido, como o ElasticSearch.
Confira este artigo para mais detalhes.
fonte
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 a palavra-chave
limit
. : Pfonte
Minha observação é que, mesmo que você tenha limite no HQL (hibernate 3.x), ele estará causando um erro de análise ou apenas será ignorado. (se você pedir por + desc / asc antes do limite, ele será ignorado; se você não tiver desc / asc antes do limite, isso causará erro de análise)
fonte
Se pode gerenciar um limite neste modo
Este é um código realmente simples para lidar com um limite ou uma lista.
fonte
fonte
Você precisa escrever uma consulta nativa, consulte isso .
fonte
Você pode usar a consulta abaixo
fonte
O trecho abaixo é usado para executar a consulta de limite usando o HQL.
Você pode obter o aplicativo de demonstração neste link .
fonte
fonte