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()
表构造函数工作正常。无论如何,我创建了一个单独的问题。