JOOQ插入,如果满足条件

时间:2018-09-25 13:34:48

标签: java sql postgresql jooq

我有一个名为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")
);

插入时间跟踪时,必须满足以下条件:

startTimeendTime具有相同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)

1 个答案:

答案 0 :(得分: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.*;