Първо, фактът, че трябва да предадете повече от 2000 идентификатора (съдейки по вашата 1-ва точка) към заявка, е предупредителен звънец сам по себе си. Може би има по-добър начин за решаване на основния проблем.
Можете да използвате подход №2 и да сортирате всеки списък, след което да извършите mergesort в рамките на приложението. Това ще изисква допълнителен код, но вероятно (ако приемем, че действителната заявка е относително бърза) ще се представи по-добре от подход №3.
За #3 има 2 големи недостатъка при работа с временни таблици:
- докато Hibernate ги поддържа (вижте
Table.sqlTemporaryTableCreateString
метод, той използва куп поддържащи методи вDialect
клас), те се използват вътрешно и ще изискват допълнително кодиране от ваша страна, за да бъдат достъпни от приложението. - по-важното е, че използването на временна таблица ще ви принуди да напишете вашата заявка като собствен SQL (тъй като няма да бъде картографирана). Ако използвате Criteria API, ще трябва да използвате
sqlRestriction
с подзаявка.