JOOQ вставить, если условие выполнено

2

У меня есть таблица под названием TimeTracks:

CREATE TABLE "TimeTracks" (
    "id" uuid PRIMARY KEY,
    "startTime" timestamp(3) NOT NULL,
    "endTime" timestamp(3),
    "taskId" uuid NOT NULL REFERENCES "Tasks"("id"),
    UNIQUE ("taskId", "endTime")
);

При вставке временных дорожек должно выполняться следующее условие:

startTime endTime между startTime и endTime временных дорожек с одним и тем же taskId может не перекрываться.

При использовании необработанных SQL-пользователей предлагается сделать что-то вроде этого:

insert into TimeTrack (id, startTime, endTime, taskId)
select
    'some Id', 'some startTime', 'some endTime', 'some taskId'
where not exists (
    select * from TimeTrack where
    (('some startTime' between startTime and endTime)
    or ('some endTime' between startTime and endTime))
    and ('some taskId' == taskId)
);

Как я могу сделать то же самое (или что-то с эквивалентным результатом) в JOOQ?

(Я использую PostgreSQL)

  • 0
    Я бы предложил вам добавить триггер для такого рода проверки целостности ...
  • 0
    Спасибо за подсказку :) Я собираюсь попробовать это.
Теги:
jooq

1 ответ

2
Лучший ответ

Это переводится непосредственно в jOOQ SQL:

Timetracks t = TIMETRACKS;

ctx.insertInto(t)
   .columns(t.ID, t.STARTTIME, t.ENDTIME, t.TASKID)
   .select(
       select(val(someId), val(someStartTime), val(someEndTime), val(someTaskId))
      .whereNotExists(
           selectFrom(t)
          .where( val(someStartTime).between(t.STARTTIME).and(t.ENDTIME)
              .or(val(someEndTime).between(t.STARTTIME).and(t.ENDTIME)) )
          .and(val(someTaskId).eq(t.TASKID))
       )
   )
   .execute();

Вышеупомянутое, как всегда, предполагает следующий статический импорт:

import static org.jooq.impl.DSL.*;
  • 0
    Можно ли выбрать все значения записи вместо того, чтобы выбирать каждое значение отдельно? Я хочу сделать что-то вроде .select(select(record).whereNotExists(...
  • 1
    @TobiasMarschall: это интересная мысль. Конечно, вы можете написать связующий код или использовать конструктор таблицы VALUES() : jooq.org/doc/latest/manual/sql-building/table-expressions/… . Например, selectFrom(values(record.fieldsRow())) . Не могли бы вы задать этот вопрос как новый отдельный вопрос? Тогда я могу объяснить более подробно, и будущие посетители также увидят это.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню