Генерация запроса сравнения конструкторов строк в Java / QueryDSL - PullRequest
1 голос
/ 31 марта 2020

Я пытаюсь реализовать разбиение на наборы ключей для базы данных 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 или несколькими грубыми нативными запросами?

...