2016-12-02 2 views
2

Я пытаюсь построить что-то вроде следующего запроса, используя jooq api.Могу ли я построить запрос jooq в смещение?

select x.* 
from x 
offset greatest(0, (select count(*) - 1 from x)); 

по

select(x.fields()).from(x) 
    .offset(param(greatest(val(0), select(count().sub(1)).from(x).field(0, Integer.class)))) 

Я уверен, что я использую метод offset(Param<Integer>) неправильно. Кажется, что для смещения получается null. Является ли создание смещений так, как это может сделать jooq? (Похоже, что метод offset немного ограничен в том, что он может сделать, по сравнению с остальной частью jooq api.)

(Я знаю, что этот запрос без контекста кажется неэффективным, но это на самом деле то, что я хочу делать .)

Спасибо!

+0

Вопрос: Вы можете сделать это в своей базе данных? (какая у вас база данных?) –

+1

Да. Можете сделать это в postgres. Я на самом деле делаю это с помощью CTE, но получается, что это не ограничивается CTE. – dsmith

ответ

1

Я не думаю, что любая база данных позволяет поместить непостоянное выражение в их OFFSET и LIMIT положений (это является возможно в PostgreSQL см комментариев митских в). В любом случае, jOOQ не позволяет вам это делать. Вы должны указать либо постоянное значение int, либо переменную связывания (Param).

Но вам все равно не нужна эта функция в вашем случае. Ваш гипотетический синтаксис ...

select x.* 
from x 
offset greatest(0, (select count(*) - 1 from x)); 

равносильна этому:

select x.* 
from x 
order by <implicit ordering> desc 
limit 1; 

В конце концов, ваш запрос, кажется, ищет последнего строки (по некоторым неявным упорядочением), так почему бы не просто сделать это явным?

+0

Упомянутое выше, но это законный синтаксис postgres. Когда я получу таблицу, исходного поля упорядочения нет (поэтому я не могу отменить порядок). Вам придется переработать мой запрос на более высоком уровне, чтобы получить мои желаемые результаты. В любом случае, просто подтверждая, что jooq не позволяет строить запросы, подобные этому. Благодарю. – dsmith

+0

@dsmith: О, спасибо за указатель. Я не знал об этом. Я создал запрос функции для этого: https://github.com/jOOQ/jOOQ/issues/5695. Конечно, вы * можете * работать с ограничением jOOQ, перехватывая сгенерированную строку SQL и исправляя в ней собственное выражение 'OFFSET'. Например. используя 'ExecuteListener' –

Смежные вопросы