Dans Hibernate 3, existe-t-il un moyen de faire l'équivalent de la limite MySQL suivante dans HQL?
select * from a_table order by a_table_column desc limit 0, 20;
Je ne veux pas utiliser setMaxResults si possible. Cela était certainement possible dans l'ancienne version de Hibernate / HQL, mais il semble avoir disparu.
java
hibernate
hql
hibernate3
stevedbrown
la source
la source
Hibernate-5.0.12
. N'est-ce toujours pas disponible? Il serait très difficile d'obtenir un million d'enregistrements environ, puis d'appliquer le filtresetMaxResults
dessus, comme l'a remarqué @Rachel dans la réponse de @skaffman.Réponses:
Cela a été publié sur le forum Hibernate il y a quelques années lorsqu'on lui a demandé pourquoi cela fonctionnait dans Hibernate 2 mais pas dans Hibernate 3:
Donc, si cela a fonctionné dans Hibernate 2, il semble que ce soit par hasard, plutôt que par conception. Je pense c'était parce que l'analyseur Hibernate 2 HQL remplacerait les bits de la requête qu'il reconnaissait comme HQL, et laisserait le reste tel qu'il était, afin que vous puissiez vous faufiler dans du SQL natif. Hibernate 3, cependant, a un analyseur AST HQL approprié, et c'est beaucoup moins indulgent.
Je pense que c'est
Query.setMaxResults()
vraiment votre seule option.la source
setMaxResults
ce qui prendrait un nombre limité de lignes de résultats du jeu de résultats et l'afficherait à l'utilisateur, dans mon cas, j'ai 3 millions d'enregistrements qui sont interrogés, puis j'appelle setMaxResults pour définir 50 enregistrements mais je ne veux pas faire cela, alors que la requête elle-même je veux interroger 50 enregistrements, y a-t-il un moyen de le faire?setMaxResults
hibernate ajoutera lalimit
pièce à la requête. Il n'obtiendra pas tous les résultats. Vous pouvez vérifier la requête qu'il produit en activant:<property name="show_sql">true</property>
la source
setFirstResult
est en fait mentionné dans cette réponse alors qu'ici et ailleurs, ils disent simplementsetMaxResults
ceci etsetMaxResults
cela sans mentionner comment définir le décalage.Si vous ne souhaitez pas l'utiliser
setMaxResults()
sur l'Query
objet, vous pouvez toujours revenir à l'utilisation de SQL normal.la source
Si vous ne souhaitez pas utiliser setMaxResults, vous pouvez également utiliser Query.scroll au lieu de list et récupérer les lignes de votre choix. Utile pour la pagination par exemple.
la source
setMaxResults()
charge d'abord chaque enregistrement en mémoire, puis crée une sous-liste, qui, lorsqu'il y a des centaines de milliers d'enregistrements ou plus, plante le serveur, car il manque de mémoire. Je pourrais cependant passer d'une requête typée JPA à une requête HibernateQueryImpl hibernateQuery = query.unwrap(QueryImpl.class)
et ensuite je pourrais utiliser lascroll()
méthode comme vous l'avez suggéré.Vous pouvez facilement utiliser la pagination pour cela.
vous devez passer
new PageRequest(0, 1)
pour récupérer les enregistrements et dans la liste récupérer le premier enregistrement.la source
Les
setFirstResult
etsetMaxResults
Query
méthodesPour un JPA et Hibernate
Query
, lasetFirstResult
méthode est l'équivalent deOFFSET
, et lasetMaxResults
méthode est l'équivalent de LIMIT:L'
LimitHandler
abstractionHibernate
LimitHandler
définit la logique de pagination spécifique à la base de données et, comme illustré par le diagramme suivant, Hibernate prend en charge de nombreuses options de pagination spécifiques à la base de données:Maintenant, selon le système de base de données relationnelle sous-jacent que vous utilisez, la requête JPQL ci-dessus utilisera la syntaxe de pagination appropriée.
MySQL
PostgreSQL
serveur SQL
Oracle
L'avantage d'utiliser
setFirstResult
etsetMaxResults
est qu'Hibernate peut générer la syntaxe de pagination spécifique à la base de données pour toutes les bases de données relationnelles prises en charge.Et, vous n'êtes pas limité aux requêtes JPQL uniquement. Vous pouvez utiliser la méthode
setFirstResult
etsetMaxResults
sept pour les requêtes SQL natives.Requêtes SQL natives
Vous n'avez pas à coder en dur la pagination spécifique à la base de données lorsque vous utilisez des requêtes SQL natives. Hibernate peut ajouter cela à vos requêtes.
Donc, si vous exécutez cette requête SQL sur PostgreSQL:
Hibernate le transformera comme suit:
Cool, non?
Au-delà de la pagination basée sur SQL
La pagination est bonne lorsque vous pouvez indexer les critères de filtrage et de tri. Si vos exigences de pagination impliquent un filtrage dynamique, c'est une bien meilleure approche que d'utiliser une solution à index inversé, comme ElasticSearch.
Consultez cet article pour plus de détails.
la source
String hql = "select userName from AccountInfo order by points desc 5";
Cela a fonctionné pour moi sans utiliser
setmaxResults();
Fournissez simplement la valeur maximale dans le dernier (dans ce cas 5) sans utiliser le mot clé
limit
. : Pla source
Mon observation est que même si vous avez une limite dans le HQL (hibernate 3.x), cela provoquera une erreur d'analyse ou sera simplement ignoré. (si vous avez commandé par + desc / asc avant la limite, il sera ignoré, si vous n'avez pas desc / asc avant la limite, cela provoquera une erreur d'analyse)
la source
Si peut gérer une limite dans ce mode
Il s'agit d'un code très simple pour gérer une limite ou une liste.
la source
la source
Vous devez écrire une requête native, référez - vous à ceci .
la source
Vous pouvez utiliser la requête ci-dessous
la source
L'extrait ci-dessous est utilisé pour effectuer une requête de limite à l'aide de HQL.
Vous pouvez obtenir une application de démonstration sur ce lien .
la source
la source