JOOQ:从Field中提取值

时间:2017-01-26 08:39:23

标签: sequence jooq

我有一张PK表和另一列其他id。在某些情况下,我需要在两列中插入具有相等值的记录。对于主键值,我使用的是序列,它从Field<Long>得到Sequences.MY_SEQ.nextval()

如何从Field<Long>中提取值以保证在两列中插入相同的ID?在insert子句中使用Field<Long>会在列中生成2个不同的ID。

2 个答案:

答案 0 :(得分:1)

以下是解决方案:

Long id = dsl.select(Sequences.MY_SEQ.nextval()).fetchOne().value1();

答案 1 :(得分:1)

Your own solution当然有效,但它会产生两次往返数据库的往返。一个用于获取序列值,另一个用于插入。如果那不是问题,那就完美了。否则,您仍然可以使用INSERT .. SELECT在一个查询中执行此操作:

在SQL中:

(使用Oracle语法。您的SQL语法可能会有所不同......)

INSERT INTO my_table (col1, col2, val)
SELECT t.id, t.id, 'abc'
FROM (
  SELECT my_seq.nextval AS id
  FROM dual
) t

使用jOOQ

Table<?> t = table(select(MY_SEQ.nextval().as("id"))).as("t");

dsl.insertInto(MY_TABLE)
   .columns(MY_TABLE.COL1, MY_TABLE.COL2, MY_TABLE.VAL)
   .select(
      select(t.field("id"), t.field("id"), val("abc"))
     .from(t))
   .execute();