【问题标题】:JOOQ: Select, Modify and insert into the same table?JOOQ:选择、修改和插入到同一个表中?
【发布时间】:2020-06-16 04:33:03
【问题描述】:

使用原生 SQL,我可以选择、修改记录并将其插入到表中,如下所示:

INSERT INTO MyTable (url, userName, id)
SELECT url, userName, '27AD2421-83B1-4872-A723-5BDF93688D7C'
FROM WebSite
WHERE id = '27AD2421-83B1-4872-A723-5BDF93688D7B'

这特别有用,因为 ID 字段是主键。

我想使用 JOOQ 在 Java 中做同样的事情,但我不知道如何提供修改后的字段值。

这可能吗,如果可以,怎么做?

【问题讨论】:

    标签: sql jooq


    【解决方案1】:

    解决您的问题

    您可以使用DSL.val()(通常首选)或DSL.inline()T 类型的任何值转换为Field<T> 类型的表达式

    现状说明

    在支持类型别名和无标签联合的语言(例如 TypeScript、Ceylon)中,jOOQ API 可以这样定义:

    // All of these are "column expressions"
    type F<T> = T | Field<T> | Select<? extends Record1<T>> | ...;
    
    interface DSLContext {
        <T1>         XYZ<Record1<T1>>         select(F<T1> field1);
        <T1, T2>     XYZ<Record1<T1, T2>>     select(F<T1> field1, F<T2> field2);
        <T1, T2, T3> XYZ<Record1<T1, T2, T3>> select(F<T1> field1, F<T2> field2, F<T3> field3);
    }
    

    但不幸的是,Java 不支持这一点。我们必须模仿上面的唯一选项,这将允许在参数列表中混合Field&lt;T&gt;T 将是大量的重载(N^22 与 N = F&lt;T&gt; 中的类型数和 22 是jOOQ 的类型安全支持的最大程度):

    interface DSLContext {
    
        // Still fine
        <T1>         XYZ<Record1<T1>>         select(T1        f1);
        <T1>         XYZ<Record1<T1>>         select(Field<T1> f1);
    
        // OK-ish
        <T1, T2>     XYZ<Record1<T1, T2>>     select(T1        f1, T2        f2);
        <T1, T2>     XYZ<Record1<T1, T2>>     select(T1        f1, Field<T2> f2);
        <T1, T2>     XYZ<Record1<T1, T2>>     select(Field<T1> f1, T2        f2);
        <T1, T2>     XYZ<Record1<T1, T2>>     select(Field<T1> f1, Field<T2> f2);
    
        // Problems start here
        <T1, T2, T3> XYZ<Record1<T1, T2, T3>> select(T1        f1, T2        f2, T3        f3);
        <T1, T2, T3> XYZ<Record1<T1, T2, T3>> select(T1        f1, T2        f2, Field<T3> f3);
        <T1, T2, T3> XYZ<Record1<T1, T2, T3>> select(T1        f1, Field<T2> f2, T3        f3);
        <T1, T2, T3> XYZ<Record1<T1, T2, T3>> select(T1        f1, Field<T2> f2, Field<T3> f3);
        <T1, T2, T3> XYZ<Record1<T1, T2, T3>> select(Field<T1> f1, T2        f2, T3        f3);
        <T1, T2, T3> XYZ<Record1<T1, T2, T3>> select(Field<T1> f1, T2        f2, Field<T3> f3);
        <T1, T2, T3> XYZ<Record1<T1, T2, T3>> select(Field<T1> f1, Field<T2> f2, T3        f3);
        <T1, T2, T3> XYZ<Record1<T1, T2, T3>> select(Field<T1> f1, Field<T2> f2, Field<T3> f3);
    }
    

    由于这种令人望而却步的复杂性,jOOQ 通常只为“所有绑定值”或“所有表达式”提供 API。在select() 的情况下,“所有绑定变量”的情况非常罕见,我们决定省略它:

    interface DSLContext {
        <T1>         XYZ<Record1<T1>>         select(Field<T1> f1);
        <T1, T2>     XYZ<Record1<T1, T2>>     select(Field<T1> f1, Field<T2> f2);
        <T1, T2, T3> XYZ<Record1<T1, T2, T3>> select(Field<T1> f1, Field<T2> f2, Field<T3> f3);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多