Java 如果满足条件,则插入JOOQ

Java 如果满足条件,则插入JOOQ,java,sql,postgresql,jooq,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") ); 插入时间轨迹时,必须满足以下条件:

我有一个名为
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")
);
插入时间轨迹时,必须满足以下条件:

具有相同任务ID的时间轨迹的
startTime
endTime
之间的时间跨度不得重叠

使用原始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.插入物(t)
.列(t.ID、t.STARTTIME、t.ENDTIME、t.TASKID)
.选择(
选择(val(someId)、val(someStartTime)、val(someEndTime)、val(someTaskId))
.哪里不存在(
选择从(t)
.where(val(someStartTime).介于(t.STARTTIME.)和(t.ENDTIME)之间
.或(val(someEndTime).介于(t.STARTTIME.)和(t.ENDTIME))之间)
.和(val(someTaskId).eq(t.TASKID))
)
)
.execute();
与往常一样,上述假设为以下静态导入:

import static org.jooq.impl.DSL.*;

我建议您为此类完整性检查添加一个触发器……感谢您的提示:)我将尝试一下。是否可以选择记录的所有值,而不是单独选择每个值?我想做一些类似于
.select(select(record)的事情。whereNotExists(…
@TobiasMarschall:这是一个有趣的想法。当然,您可以编写粘合代码,或者使用
VALUES()
表构造函数:。例如
selectFrom(VALUES(record.fieldsRow()))
。你介意将其作为一个新的单独问题提问吗?然后我可以详细解释,未来的访问者也会看到。使用
VALUES()
表构造函数工作正常。无论如何,我创建了一个单独的问题。