【问题标题】:JOOQ insert if condition is met如果满足条件,则插入 JOOQ
【发布时间】:2019-03-01 03:48:38
【问题描述】:

我有一张桌子叫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")
);

在插入时间轨迹时,必须满足以下条件:

具有相同taskId 的时间轨迹的startTimeendTime 之间的时间跨度可能不会重叠。

当使用原始 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)

【问题讨论】:

  • 我建议您为这种完整性检查添加一个触发器...
  • 感谢您的提示 :) 我要试试。

标签: java sql postgresql jooq


【解决方案1】:

这直接转化为 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(...
  • @TobiasMarschall:这是一个有趣的想法。当然,您可以编写胶水代码,或者使用VALUES() 表构造函数:jooq.org/doc/latest/manual/sql-building/table-expressions/…。例如。 selectFrom(values(record.fieldsRow()))。您介意将其作为一个新的单独问题提出吗?然后我可以更详细地解释,未来的访问者也会看到它。
  • 使用VALUES() 表构造函数工作正常。无论如何,我创建了一个单独的问题。 stackoverflow.com/q/52538400/6172447
猜你喜欢
  • 2023-04-05
  • 1970-01-01
  • 1970-01-01
  • 2011-03-19
  • 1970-01-01
  • 2013-10-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多