Em primeiro lugar, o fato de você precisar passar mais de 2.000 ids (a julgar pelo seu primeiro ponto) para uma consulta é um aviso por si só. Talvez haja uma maneira melhor de resolver o problema subjacente.
Você pode usar a abordagem nº 2 e classificar cada lista e, em seguida, executar mergesort dentro do aplicativo. Isso exigirá código extra, mas provavelmente (supondo que a consulta real seja relativamente rápida) tenha um desempenho melhor do que a abordagem nº 3.
Para #3, existem 2 grandes desvantagens em lidar com tabelas temporárias:
- enquanto o Hibernate os suporta (veja
Table.sqlTemporaryTableCreateString
método, ele usa vários métodos de suporte noDialect
class), eles são usados internamente e exigirão codificação adicional de sua parte para serem acessados no aplicativo. - mais importante, usar uma tabela temporária forçará você a escrever sua consulta como SQL nativo (já que ela não será mapeada). Se você estiver usando a API Criteria, precisará usar
sqlRestriction
com uma subconsulta.