【问题标题】:INSERT .. SELECT with some default values in MySQL with JOOQ使用 JOOQ 在 MySQL 中使用一些默认值插入 .. SELECT
【发布时间】:2018-05-25 18:03:39
【问题描述】:

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

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

【问题讨论】:

  • JOOQ 没有提供一种方法来执行原生(普通)SQL jooq.org/doc/latest/manual/getting-started/use-cases/…
  • 嗨,雷蒙德。是的,我知道这一点。我一直在寻找一种使用代码生成并确保类型安全的解决方案。我已经相应地更新了我的问题。

标签: java mysql sql jooq


【解决方案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.*;

【讨论】:

  • 酷!。我完全不知道 val 函数。谢谢卢卡斯!
  • @rkudva:然而,你一直在使用它,在幕后(例如Field.eq(T)):-) 这里有更多信息:jooq.org/doc/latest/manual/sql-building/bind-values
  • 在我的应用程序中,java.util.UUID 在 MySQL 中存储为 BINARY 数据类型。 BINARY 的默认 JDBC 数据类型是 byte[]。所以我有一个自定义转换器来在 UUID 和字节 [] 之间进行转换。在我发布的原始问题中,如果Person.idBINARY 类型并且我有一个常量UUID 变量,我如何将它与DSL.val 函数一起使用?就目前而言,它会抛出以下异常Data truncation: Data too long for column 'snapshot_id' at row 1; 问题可能与this有关吗?
  • Lukas,我创建了一个 new post 并发布了我的解决方案。谢谢!
  • @HeyThere:您可以随时使用别名DSL.value()
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-24
  • 2016-01-31
相关资源
最近更新 更多