当前位置: 首页 > 知识库问答 >
问题:

JOOQ:选择,修改和插入到同一个表?

钮巴英
2023-03-14

使用本机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中做同样的事情,但我不知道如何提供修改后的字段值。

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

共有1个答案

吕亮
2023-03-14

您可以将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不支持这一点。我们唯一的选择是模拟上面的内容,这将允许混合字段

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通常只为“所有绑定值”或“所有表达式”提供应用编程接口。在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);
}

 类似资料:
  • 问题内容: 我正在插入一条记录,我想使用插入的最后一条记录的ID。这是我尝试过的: 我收到错误消息: SQL语法错误;请查看与您的MySQL服务器版本相对应的手册,以在“ SELECT LAST_INSERT_ID()”附近使用正确的语法。谁能告诉我我的错误在哪里?谢谢! 问题答案: 签出mysql_insert_id() 在mysql_query()命令中执行INSERT语句后运行该函数时,其结

  • 我想在SQL中执行以下操作: 在jOOQ中,我将subQ存储到Select中 我的问题是,如何从subQ中获取maxCol列,并在join中使用它?我的连接是这样的: 我在()上出错 类型字段中的方法eq(字符串)不适用于参数(字段) 我该怎么办?

  • 问题内容: 有没有办法插入预设值和我从选择查询中获得的值?例如: 我有“字符串”的值和数字5,但是我必须从这样的选择中找到[int]值: 那给我那个ID放在table1里面。 如何将其合并为一个语句? 问题答案: 使用查询,并将已知值放入:

  • 就像有人说的第二种方式更慢,但我不确定,那么哪种方式更好呢?不能使数据库崩溃。

  • 本文向大家介绍d3.js 基本选择和修改,包括了d3.js 基本选择和修改的使用技巧和注意事项,需要的朋友参考一下 示例 如果您熟悉jQuery和Sizzle语法,则d3选择应该不会有太大不同。d3模仿W3C Selectors API,使与元素的交互更加容易。 作为一个基本示例,请选择全部<p>并对其进行更改: 简而言之,这与jQuery中的相对相同 通常,您将对容器div进行一次选择,以添加一

  • 问题内容: 我是SQL的初学者,对Transact-SQL不太了解。 我意识到这是一个新手问题,但是我正在寻找一个简单的解决方案。 我有一个带有一些列()的表。 主表 我想从该表中选择数据并插入到其他两个表中。 第一桌 是来自的前三个字符的组合 第一个表中的数据按的前三个字符和客户代码分组 第二张桌子 那么,如何通过使用SQL选择主表的行来插入第一张表和第二张表呢? 感谢您的所有答复。 问题答案: