Po pierwsze, fakt, że musisz przekazać więcej niż 2000 identyfikatorów (sądząc po pierwszym punkcie) do zapytania, jest sam w sobie dzwonkiem ostrzegawczym. Być może istnieje lepszy sposób rozwiązania podstawowego problemu.
Możesz użyć podejścia nr 2 i posortować każdą listę, a następnie przeprowadzić sortowanie przez scalanie w aplikacji. Będzie to wymagało dodatkowego kodu, ale prawdopodobnie (zakładając, że rzeczywiste zapytanie jest stosunkowo szybkie) będzie działać lepiej niż podejście nr 3.
W przypadku #3 istnieją 2 duże wady radzenia sobie z tabelami tymczasowymi:
- podczas gdy Hibernate je obsługuje (spójrz na
Table.sqlTemporaryTableCreateString
metoda, używa wielu metod pomocniczych wDialect
klasy), są używane wewnętrznie i będą wymagać dodatkowego kodowania z Twojej strony, aby były dostępne z aplikacji. - Co ważniejsze, użycie tabeli tymczasowej zmusi Cię do napisania zapytania jako natywnego SQL (ponieważ nie będzie ono mapowane). Jeśli używasz Criteria API, będziesz musiał użyć
sqlRestriction
z podzapytaniem.