Tout d'abord, le fait que vous deviez transmettre plus de 2000 identifiants (à en juger par votre 1er point) à une requête est une sonnette d'alarme en soi. Il existe peut-être une meilleure façon de résoudre le problème sous-jacent.
Vous pouvez utiliser l'approche n ° 2 et trier chaque liste, puis effectuer un tri par fusion dans l'application. Cela nécessitera du code supplémentaire, mais sera probablement (en supposant que la requête réelle est relativement rapide) plus performant que l'approche #3.
Pour #3, il y a 2 gros inconvénients à gérer les tables temporaires :
- alors qu'Hibernate les prend en charge (regardez
Table.sqlTemporaryTableCreateString
méthode, il utilise un tas de méthodes de support dans leDialect
class), ils sont utilisés en interne et nécessiteront un codage supplémentaire de votre part pour être accessibles depuis l'application. - plus important encore, l'utilisation d'une table temporaire vous obligera à écrire votre requête en SQL natif (puisqu'elle ne sera pas mappée). Si vous utilisez l'API Criteria, vous devrez utiliser
sqlRestriction
avec une sous-requête.