Innanzitutto, il fatto che devi passare più di 2000 ID (a giudicare dal tuo primo punto) a una query è un campanello d'allarme in sé e per sé. Forse c'è un modo migliore per risolvere il problema di fondo.
È possibile utilizzare l'approccio n. 2 e ordinare ogni elenco, quindi eseguire il mergesort all'interno dell'applicazione. Ciò richiederà codice aggiuntivo, ma probabilmente (supponendo che la query effettiva sia relativamente veloce) avrà prestazioni migliori rispetto all'approccio n. 3.
Per il numero 3, ci sono 2 grandi svantaggi nell'affrontare i tavoli temporanei:
- mentre Hibernate li supporta (guarda
Table.sqlTemporaryTableCreateString
metodo, utilizza una serie di metodi di supporto nelDialect
class), vengono utilizzati internamente e richiedono una codifica aggiuntiva da parte tua per essere accessibili dall'app. - ancora più importante, l'utilizzo di una tabella temporanea ti costringerà a scrivere la tua query come SQL nativo (poiché non verrà mappata). Se stai usando Criteria API dovrai usare
sqlRestriction
con una sottoquery.