У меня есть таблица под названием 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)
Это переводится непосредственно в 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.*;
.select(select(record).whereNotExists(...
VALUES()
: jooq.org/doc/latest/manual/sql-building/table-expressions/… . Например, selectFrom(values(record.fieldsRow()))
. Не могли бы вы задать этот вопрос как новый отдельный вопрос? Тогда я могу объяснить более подробно, и будущие посетители также увидят это.