Я пытаюсь реализовать разбиение на наборы ключей для базы данных postgresql в репозитории Java, который использует QueryDSL / JPA для генерации запросов. Обычный шаблон использует класс BooleanBuilder
querydsl для построения запросов, затем использует repository.findAll
с этим запросом.
В моем случае, в идеале, запросы, которые я хотел бы генерировать, использовали бы синтаксис конструктора строк, то есть
select * from table
where (col1, col2) < (val1, val2)
order by col1 desc col2 desc offset n;
однако, насколько я могу судить, этот синтаксис не поддерживается querydsl. Чтобы обойти это, я преобразовал вышеупомянутый запрос в его логический эквивалент, который равен
select * from table
where col1 < val1 or (col1 = val1 and col2 < val2)
order by col1 desc col2 desc offset n;
, и получается, что при объединенном индексе (col1, col2) синтаксис конструктора строки является значительно более производительным, чем его логически эквивалентный синтаксис (для таблицы с записями 300 тыс. запросов было около 5 мс против 175 мс).
Я бы предпочел использовать какую-то библиотеку построения запросов для генерации моих запросов, поскольку существует множество других необязательных параметры, которые делают запись нативных запросов для каждого случая несостоятельной. Кто-нибудь знает способ сделать это, используя что-то вроде BooleanBuilder
, или я застрял с менее производительной реализацией запросов dsl или несколькими грубыми нативными запросами?