2009-11-04 12 views

Répondre

4

Cette limitation de base de données existe toujours avec Hibernate. Si vous avez réellement besoin de plus de 1000 éléments dans votre clause in, vous devrez diviser la liste vous-même dans le code et exécuter la requête pour chaque bloc de 1000 clés, puis ajouter les ensembles de résultats ensemble. Notez que ce hack se décompose si votre requête doit trier ou agréger autrement les résultats de la requête car l'ensemble complet des résultats ne sera connu que dans le code. Dans ce cas, vous êtes mieux de trouver un autre moyen d'écrire la requête qui ne nécessite pas une clause IN.

+1

Une autre méthode consisterait à coller les valeurs 1000+ dans une table temporaire globale dans la base de données et à joindre les deux tables. Les bases de données sont très bien à la table jointe :) –

+0

Laissez la base de données faire le travail! La division est un travail bien connu mais qui devrait indiquer que vous devez repenser votre approche. –

+0

Une autre alternative est de faire OU sur les groupes 1000 éléments IN. De cette façon, vous pouvez "ORDER BY" sur la quiry. – hidralisk

2

Oui comme Hibernate appeler Oracle à un moment donné si la limite est la plus faible des limites dans Hibernate et Oracle

Hibernate rien de spécial avec des données pour un en - passe juste à la base de données

3

Nous avons eu le même problème et a résolu le problème en le divisant en paquets de 100ER de clause IN

select * from mytable where id in (...) or id in (...). 

Remarques:

  • assurez-vous que vous utilisez des variables de liaison
  • Assurez-vous que la requête est toujours la même. Cela se fait en remplissant les clauses avec -1 jusqu'à ce que vous avez 100 éléments dans ce
  • essayer d'utiliser toujours le même nombre de ORed dans (...) de sorte que la requête ressemble toujours à même

Pourquoi voulez-vous les points ci-dessus? C'est ainsi que l'optimiseur de requête peut réutiliser le plan de requête.

optimisation supplémentaire:

  • au lieu d'utiliser -1, vous pouvez simplement utiliser à nouveau la valeur true dernier. C'est même un peu mieux.

exemple: en (1, 2, 3, 4, 4, ..., 4)

A noter également: nous avons testé avec différents nombres d'éléments fixes dans la clause et à une diminution des performances observé pour beaucoup de 100 éléments.

+0

PS: si l'instruction sql qui renvoie les valeurs dans la clause IN est connue, vous pouvez également envisager de remplacer votre IN avec une instruction EXISTS. –