使用JOOQ在MySQL中使用一些默认值INSERT .. SELECT

时间:2018-05-24 15:53:27

标签: java mysql sql jooq

假设我有一张表Person(id, fname, lname),它包含一条记录(1, 'Michael', 'Bay')。现在我希望在Person表中创建另一条记录,其中包含相同的fname和lname但不同的id,即(453456, 'Michael', 'Bay')。这是我在纯SQL中的方式

INSERT INTO Person(id, fname, lname)
SELECT 453456, Person.fname, Person.lname
FROM Person
WHERE Person.id = 1; 

如何使用JOOQ(理想情况下保留JOOQ的代码生成和类型安全功能)?

我知道JOOQ提供了使用selectFrom语法将整个记录从一个表复制到同一个或另一个表的能力

jooq.insertInto(PERSON)
      .select(selectFrom(PERSON).where(PERSON.ID.eq(1)))
      .execute();

但在我的情况下,记录中只有某些列需要复制,而其余的值需要明确设置

我能想到的另一个解决方案是以下

jooq.insertInto(PERSON)
      .values(452452)
      .execute();

jooq.update(PERSON)
  .set(row(PERSON.FNAME, PERSON.LNAME),
       select(PERSON.FNAME, PERSON.LNAME)
      .from(PERSON)
      .where(PERSON.ID.eq(1)))
  .where(PERSON.ID.eq(452452))
  .execute();

但感觉不对。如果有人能为此问题提供任何其他解决方案/解决方法,我将不胜感激。

1 个答案:

答案 0 :(得分:1)

jooq.insertInto(PERSON)
    .columns(PERSON.ID, PERSON.FNAME, PERSON.LNAME)
    .select(select(val(452452), PERSON.FNAME, PERSON.LNAME)
           .from(PERSON)
           .where(PERSON.ID.eq(1)))
    .execute();

与往常一样,这是假设以下静态导入:

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