Comment faites-vous une limite de requête HQL?
Dans Hibernate 3, est-il possible de faire l'équivalent de la suite de MySQL limite dans les requêtes HQL?
select * from a_table order by a_table_column desc limit 0, 20;
Je ne veux pas utiliser setMaxResults si possible. Ce n'était certainement possible dans l'ancienne version d'Hibernate/HQL, mais il semble avoir disparu.
- Je suis à l'aide de
Hibernate-5.0.12
. Est-ce toujours pas disponible? Il serait vraiment lourd à obtenir un million d'enregistrements et ensuite appliquer le filtre sur elle-setMaxResults
sur elle comme remarqué par @Rachel dans la réponse par @skaffman.
Vous devez vous connecter pour publier un commentaire.
Cela a été posté sur Hibernate forum quelques années en arrière quand on lui demande pourquoi cela a fonctionné dans Hibernate 2, mais pas dans Hibernate 3:
Si cela a fonctionné dans Hibernate 2, il semble que c'était par hasard, plutôt que par la conception. Je pense c'était parce que le Hibernate 2 HQL analyseur de remplacer les bits de la requête qu'il a reconnu comme HQL, et de laisser le reste tel qu'il était, afin que vous pourrait se faufiler dans certains natif SQL. Hibernate 3, cependant, a une bonne AST HQL Analyseur, et c'est beaucoup moins indulgent.
Je pense que
Query.setMaxResults()
est vraiment votre seule option.setMaxResults
qui prendrait nombre limité de lignes de résultat de resultset et de l'afficher à l'utilisateur, dans mon cas, j'ai 3 millions d'enregistrements qui sont interrogés et puis fais appel setMaxResults pour définir les 50 dossiers, mais je ne veux pas le faire, alors que la requête elle-même, je veux requête pour 50 dossiers, est-il un moyen de le faire?setMaxResults
hibernate va ajouter lalimit
partie à la requête. Il ne sera pas obtenir tous les résultats. Vous pouvez vérifier la requête qu'il produit par l'activation:<property name="show_sql">true</property>
limit
outop
mot-clé, il a unrownum
bien, mais vous ne pouvez pas l'utiliser en combinaison avec tri, à moins que vous l'envelopper (c'est à dire utiliser des sous-requêtes). Mais qui le rend difficile à combiner avec unjoin
. MySQL et Teradata utilisationtop
et exige qu'il soit juste en face de la requête, mais mysql oblige à être tout le chemin à l'arrière à l'aide de lalimit
mot-clé. Je n'ai aucune difficulté à croire que MySQL et SQL Server prennent en charge, mais je serais surpris si l'Oracle n'.setMaxResults()
ne pas ajouterlimit
à la requête (pour Oracle DB), mais les charges de tous les enregistrements de la mémoire et de la réduction du nombre de disques. Lorsque vous avez des millions d'enregistrements correspondants, ce qui signifie un OutOfMemoryError (ou d'erreur lié)Hibernate-5.0.12
. Est-ce toujours pas disponible? Il serait vraiment lourd à obtenir un million d'enregistrements, puis appliquer le filtre-setMaxResults
sur elle comme remarqué par @Rachel.setFirstResult
est pas mentionnée dans cette réponse, tandis qu'ici et ailleurs, ils disent justesetMaxResults
ce etsetMaxResults
que sans mentionner la façon de définir le décalage de la.Si vous ne souhaitez pas utiliser
setMaxResults()
sur leQuery
objet alors vous pouvez toujours revenir en arrière à l'aide de SQL normales.Si vous ne souhaitez pas utiliser setMaxResults, vous pouvez également utiliser la Requête.faites défiler jusqu'à la place de la liste, et d'extraire les lignes que vous désirez. Utile pour la pagination, par exemple.
setMaxResults()
charge en premier chaque enregistrement dans la mémoire et ensuite crée une sous-liste, qui, lorsqu'il y a des centaines de milliers ou plusieurs enregistrements plante le serveur, car il est à court de mémoire. J'ai pu cependant aller à partir d'un APC tapé la requête pour une requête hql parQueryImpl hibernateQuery = query.unwrap(QueryImpl.class)
et puis je pourrais utiliser lescroll()
méthode comme vous l'avez suggéré.setMaxResults()
.String hql = "select userName from AccountInfo order by points desc 5";
Cela a fonctionné pour moi, sans l'aide de
setmaxResults();
Il suffit de fournir la valeur max dans le dernier (dans ce cas 5) sans utiliser le mot clé
limit
.😛
Mon observation est que même si vous avez de limite dans le HQL (hibernate 3.x), il sera soit en provoquant l'erreur d'analyse ou tout simplement ignoré. (si vous avez de l'ordre de + desc/asc avant la limite, il sera ignoré, si vous n'avez pas desc/asc avant la limite, il sera la cause erreur d'analyse)
Si vous pouvez gérer une limite dans ce mode
C'est vraiment un code simple pour gérer une limite ou une liste.
Vous avez besoin d'écrire une requête native, reportez-vous cette.
Vous pouvez facilement utiliser la pagination pour cela.
vous devez passer
new PageRequest(0, 1)
pour récupérer les dossiers et à partir de la liste de récupérer le premier enregistrement.