【问题标题】:JOOQ: extract value from FieldJOOQ:从字段中提取值
【发布时间】:2017-06-11 16:39:19
【问题描述】:

我有一个带有 PK 的表和另一个用于其他 ID 的列。在某些情况下,我需要在两列中插入具有相等值的记录。对于主键值,我使用的是序列,它给出了来自Sequences.MY_SEQ.nextval()Field<Long>

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

【问题讨论】:

    标签: sequence jooq


    【解决方案1】:

    解决办法如下:

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

    【讨论】:

      【解决方案2】:

      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();
      

      【讨论】:

      • 谢谢卢卡斯!您的解决方案允许使用单个数据库请求,并且对于高负载的表(例如许多插入)非常有用。
      猜你喜欢
      • 2018-01-04
      • 2012-02-09
      • 1970-01-01
      • 2017-02-04
      • 2018-02-20
      • 2015-11-15
      • 2020-04-26
      • 1970-01-01
      • 2021-06-01
      相关资源
      最近更新 更多