Хотя, в статейке, что ты скидывал, я нашёл вот такой пример. И есть такое ощущение, что он сможет мне помочь
Ну да, дело не HQL - не он тормозит скорее всего, а предыдущие операции не висят в репозитории, ге закончены в БД. И Hibernate усердно проверяет эти 18к записей, что они в сенсионном кэше актуальны и потом вырезают из них 15 штук для пейдинга. Даже просто редим Read_only для запроса может спасти, т.к. не будет лишних проходов по репозитории с блокировками.
Но это не точно, навскидку не помню.
Последнее время предпочитаю красивую спецификацию Spring JDBC и ehcache, в большинстве задач это управляемей, шустрей и проще в опровождении, хотя кода писать в начале нуюнл больше. С Hibernate меньше сталкиваюсь.