插入在mysql和jooq中使用一些默认值进行选择

mzmfm0qo  于 2021-06-23  发布在  Mysql
关注(0)|答案(1)|浏览(414)

假设我有一张table 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();

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

k5ifujac

k5ifujac1#

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.*;

相关问题