INSERT .. SELECT с некоторыми значениями по умолчанию в MySQL с JOOQ - PullRequest
0 голосов
/ 24 мая 2018

Допустим, у меня есть таблица Person(id, fname, lname), и она содержит запись (1, 'Michael', 'Bay').Теперь я хочу создать еще одну запись в таблице Person с тем же именем и именем, но с другим идентификатором, т.е. (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 голосов
/ 25 мая 2018
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.*;
...