2016-05-15 2 views
5
List<MyTable> result = DSL.using(configuration()) 
       .select() 
       .from(MY_TABLE) 
       .where(MY_TABLE.ID1.equal(pk_id1)) 
         .and(MY_TABLE.ID2.equal(fk_id2)) 
         .and(MY_TABLE.ID3.equal(fk_id3)) 
       .orderBy(MY_TABLE.ID.asc()) 
       .limit(limit) 
       .fetchInto(MY_TABLE) 
       .map(mapper()); 

Я пытаюсь написать код, который позволит мой запрос взять три опциональные идентификаторы, например, я хотел бы запрос, чтобы в конечном счете бытьКак написать Необязательные где положения в JOOQ

select * from my_table where ID1=5 and ID2=6 and ID3=7 .... etc 

Однако Я хотел бы также возможность быть в состоянии исключить любой из идентификаторов

select * from my_table where ID2=6 and ID3=7 

или

select * from my_table where ID3=7 

Проблема с этим состоит в том, что первый «где» оговорка относится к идентификатору один, а остальные ANDS так, если бы я сделал, если заявление и я извлекал где тогда я бы просто оставил с

List<MyTable> result = DSL.using(configuration()) 
       .select() 
       .from(MY_TABLE) 
         .and(MY_TABLE.ID2.equal(fk_id2)) 
         .and(MY_TABLE.ID3.equal(fk_id3)) 
       .orderBy(MY_TABLE.ID.asc()) 
       .limit(limit) 
       .fetchInto(MY_TABLE) 
       .map(mapper()); 

и это не сработает.

Я попытался найти что-то вроде where id = *, где * is essentianlly нет фильтра, но я не мог найти ничего подобного.

ответ

5

jOOQ делает запись SQL чувствовать себя как статичный, встроенный SQL. Но это не так. Каждый запрос jOOQ представляет собой динамический SQL-запрос, состоящий из дерева выражений - вы его просто не замечаете.

Метод SelectWhereStep.where(Condition) принимает аргумент Condition, который вам не нужно размещать прямо там с помощью пункта WHERE.Вы можете построить его до запроса:

Condition condition = DSL.trueCondition(); 
if (something) 
    condition = condition.and(MY_TABLE.ID1.equal(pk_id1)); 
if (somethingElse) 
    condition = condition.and(MY_TABLE.ID2.equal(fk_id2)); 
if (somethingOther) 
    condition = condition.and(MY_TABLE.ID3.equal(fk_id3)); 

Теперь вы можете передать, что к вашему запросу:

List<MyTable> result = 
DSL.using(configuration()) 
    .select() 
    .from(MY_TABLE) 
    .where(condition) 
    .orderBy(MY_TABLE.ID.asc()) 
    .limit(limit) 
    .fetchInto(MY_TABLE) 
    .map(mapper()); 

Существует также методы коммунальных услуг DSL, такие как:

Это также задокументировано в руководстве: http://www.jooq.org/doc/latest/manual/sql-building/dynamic-sql/

+0

Я пытаюсь его, но по какой-то причине trueCondition всегда оценивает true, поэтому мой запрос просто возвращает все. Есть ли другое условие для использования? –

+1

@LukeXu: Да, это цель trueCondition ... :) вы уверены, что назначаете каждое новое условие обратно переменной? Операция a() создает новое условие. Он не изменяет левую сторону. –

+0

. Ах, хорошо, что имеет смысл, спасибо! –

2

То, о чем вы просите, иногда ссылается на «подстановочный знак» номера «SQL» или, по крайней мере, вы можете найти комментарии в Интернете, если вы его ищете.

SQL не позволяет писать «где ID = *» вместо этого, если вам нужен DDL, чтобы оставаться статичным вы можете эмулировать его, выполнив проверку диапазона, как

select * from table 
    where 
    (my_table.id1 >= fk_id1_low and my_table.id1 <= fk_id1_high) and 
    (my_table.id2 >= fk_id2_low and my_table.id2 <= fk_id2_high) and 
    (my_table.id3 >= fk_id3_low and my_table.id3 <= fk_id3_high) 

Так что теперь вы передаете в общей сложности из 6 параметров для запроса, если вы хотите сделать совпадение с id1, вы установите как fk_id1_low, так и fk_id1_high значение, которое вы хотите сопоставить. Если вы не хотите соответствовать id1, вы установите fk_id1_low на минимально возможное значение и fk_id1_high до максимально возможного значения. Одна вещь, которую вы должны учитывать, заключается в том, как обработанный запрос будет обработан механизмом базы данных, поскольку может быть выполнено большое количество дополнительной работы.

С JOOQ еще одним возможным ответом является переход от свободного интерфейса, чтобы вы могли построить запрос, используя if.. then условные части.

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