JOOQ 忽略具有默认值的数据库列

2024-05-14

看来JOOQ完全忽略了数据库列的默认值。既不会更新 ActiveRecord 对象,也不会在 INSERT 时跳过此列。相反,它尝试将其设置为 NULL,这在 NOT NULL 列上失败。

Example:

CREATE TABLE bug (
  foo int,
  bar int not null default 42
);

  BugRecord b = jooq.newRecord(BUG);
  b.setFoo(3);
  b.store();          

  assertNotNull(b.getBar()); // fails

  Record r = jooq.select().from(BUG).fetchOne();
  assertEquals(new Integer(-1), r.getValue(BUG.BAR)); // fails

  // DataMapper pattern
  Bug b = new Bug();
  b.setFoo(3);
  bugDao.insert(b); // Fails because it tries to set "bar" to NULL

我期望的行为是 newRecord() 使用 korrekt 值初始化所有默认变量(尽管我知道如果结果是自定义函数的结果,这可能会很困难:-))。或者 INSERT INTO 会这样做不插入所有带有默认值的未修改列,然后 INSERT INTO 后面跟着一个从数据库中获取现有值的 SELECT(类似于 RETURNING)。

这真的是一个错误/限制吗,还是我缺少一些配置选项等,这使得它 可以使用“非空默认”列吗?


您在这里发现了一些内容(都与 jOOQ 3.1 和以前的版本相关):

从插入返回默认值:

BugRecord b = jooq.newRecord(BUG);
b.setFoo(3);
b.store();          

assertNotNull(b.getBar()); // fails

确实,这将是一个很好的功能。目前,jOOQ 仅获取 IDENTITY 列值。您可以使用INSERT .. RETURNING http://www.jooq.org/doc/3.1/manual/sql-building/sql-statements/insert-statement/#N10F3F语法或UPDATE .. RETURNING http://www.jooq.org/doc/3.1/manual/sql-building/sql-statements/update-statement/#N10FA4语法来显式选择插入或更新后应返回哪些列。但能够在常规的 CRUD 操作中这样做会好得多。

这一点在这个线程 https://groups.google.com/forum/#!topic/jooq-user/_cp2-mrtZ7k/discussion。与此相关的功能请求是#1859 https://github.com/jOOQ/jOOQ/issues/1859.

您可以通过致电解决此问题

b.refresh();             // Refresh all columns
b.refresh(BUG.BAR, ...); // Refresh only some columns

插入 NULL 与通过插入 DEFAULTUpdatableRecord:

Record r = jooq.select().from(BUG).fetchOne();
assertEquals(new Integer(-1), r.getValue(BUG.BAR)); // fails

在我看来,这是一个错误。 jOOQ的CRUD操作应该是DEFAULT价值安全。仅那些在之前已明确设置的值store() / insert() / update()操作应该在生成的 SQL 中呈现。我已经注册了#2698 https://github.com/jOOQ/jOOQ/issues/2698为了这。

插入 NULL 与通过插入 DEFAULTDAO:

// DataMapper pattern
Bug b = new Bug();
b.setFoo(3);
bugDao.insert(b); // Fails because it tries to set "bar" to NULL

不错的收获。解决/增强这个问题并不简单,因为 POJO 并未在每列中附带内部“已更改”/“脏”标志。因此不可能知道 a 的含义nullPOJO 中的引用。

另一方面,jOOQ 已经知道列是否可以为空。如果 jOOQ 还维护有关某个对象是否存在的元数据DEFAULT列上的子句,可以推断出组合NOT NULL DEFAULT将不得不导致:

INSERT INTO bug(foo, bar)
VALUES(3, DEFAULT)

And to

UPDATE bug SET bar = DEFAULT WHERE foo = 3

我已经注册了

  • #2699 https://github.com/jOOQ/jOOQ/issues/2699:在生成的代码中添加一些元数据信息
  • #2700 https://github.com/jOOQ/jOOQ/issues/2700:利用来自 DAO 的 SQL 中的上述元数据
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

JOOQ 忽略具有默认值的数据库列 的相关文章

随机推荐

  • 将错误保存到 MySQL 数据库

    我有一个 php 查询来更新 MySQL 数据库 请参见下文 sql update hr payroll set payroll number payroll number tax code tax bacs ref bacs ref pa
  • 将多索引转换为行式多维 NumPy 数组。

    假设我有一个类似于以下示例的 MultiIndex DataFrame多索引文档 http pandas pydata org pandas docs stable advanced html gt gt gt df 0 1 2 3 fir
  • 无法识别的选择器调用静态 iOS 库中的类别方法

    我正在使用一些第三方软件来帮助使用 Xcode 4 3 2 编写 iPad 应用程序 该软件是开源的 通常经过设置 因此其代码将与开发人员为应用程序编写的任何代码一起编译 因为我在很多地方使用该软件 所以我决定将其构建为 iOS 模拟器的静
  • 垂直对齐两个弹性项目[重复]

    这个问题在这里已经有答案了 我有一个弹性容器 container和两个弹性项目 item one and item two 我想将第一个项目垂直居中并将第二个项目粘在底部 我不知道如何在这种情况下垂直对齐第一项 HTML div class
  • ListView 和快照 - 错误 - 错误状态:DocumentSnapshotPlatform 中不存在字段[重复]

    这个问题在这里已经有答案了 我对快照和 ListView 有一个小问题 到目前为止 它运行得很好 但自从我更新了 flutter 和 Dart 后 我 收到了一个错误 构建 StreamBuilder gt 时抛出以下 StateError
  • Drupal 视图 - 自定义/修改 SQL

    我遇到了 配置文件复选框 模块的问题 该模块存储以逗号分隔的自定义配置文件字段 问题是我是否创建一个视图来按值过滤 SQL 结果最终是这样的 AND profile values profile interests value in Bus
  • 对不存在的资源进行 GET 的 REST 标准

    资源 user 12345 不存在 假设消费者随机尝试不同的 id 没有授权 任何用户都可以查看任何用户 从更广泛的意义上来说 我的问题是 如果对不存在的资源执行 GET 操作 您应该返回什么 我应该为不存在的 id 返回空用户 还是应该返
  • 如何在 gridview 控件的项目模板内显示列表视图。

    如何在 gridview 控件的项目模板内显示列表视图 gridview 将列出 table bill 中的所有 bill id 列表视图将绑定 table bill details 中具有特定 item bill id 的所有 item
  • 如何在映射中将字符串转换为 Seq[String]

    我有一个Map String String 以及需要的第三方功能Map String Seq String 有没有一种简单的方法来转换它 以便我可以将地图传递给函数 original mapValues Seq 注意mapValues返回地
  • 如何将事件对象传递给 JavaScript 中的函数?

  • 将 SQL Server 日期时间转换为较短的日期格式

    我有一个datetimeSQL Server 中的列为我提供了这样的数据10 27 2010 12 57 49 pm我想查询此列 但只需让 SQL Server 返回年月日 例如 2010 10 27或类似的东西 我应该研究哪些功能 我应该
  • 烧瓶 - 404 未找到

    我是烧瓶开发的新手 这是我在烧瓶中的第一个程序 但它向我显示了这个错误 在服务器上找不到请求的 URL 如果您输入了网址 请手动检查拼写并重试 这是我的代码 from flask import Flask app Flask name ap
  • 在 C++ 中通过引用传递 std 算法谓词

    我正在尝试从 a 中删除元素std list并保留已删除元素的一些统计信息 为此 我使用列表中的remove if 函数 并且我有一个谓词 我想使用这个谓词来收集统计数据 这是谓词的代码 class TestPredicate privat
  • 使用 Jquery 附加链接

    我正在尝试根据您所在的页面添加指向我的页面的链接 我使用 Squarespace 来构建这个网站 因此对我来说最简单的方法是使用 Javascript 或 Jquery 我认为我缺少的这个语法有问题 我已经尝试用 来打破引号 但这不起作用
  • 样本()和r样本()有什么区别?

    当我从 PyTorch 中的发行版中采样时 两者sample and rsample似乎给出了类似的结果 import torch seaborn as sns x torch distributions Normal torch tens
  • Spring boot 2.3 中找不到 javax.validation [重复]

    这个问题在这里已经有答案了 升级到 Spring Boot 2 3 1 后javax validation找不到包
  • Parse::RecDescent 语法未按预期工作

    我所能做的就是 STRING PARAMS VARIABLE 和 FUNCNAME FUNCTION 似乎有问题 但我就是看不到它 use strict use Parse RecDescent RD ERRORS 1 Make sure
  • 两组数的最小公等和及组合

    我目前正在用 C 创建一个程序 该程序将查找两组数字的尽可能低的相等总和 您可以在其中根据需要多次重复这些数字 比如我有这两套 10 13 18 and 12 16 22 我能得到的最低金额是28 10 18 and 12 16 另一个例子
  • 使用 TFS 个人访问令牌克隆 Git 存储库

    我正在尝试以编程方式克隆 git 存储库 我的 ASP NET MVC 应用程序正在创建并启动一个进程 处理进程的代码工作正常 但是当尝试使用本地 TFS PAT 克隆 git 存储库时 身份验证失败 我无法使用 NTLM 或要求用户输入凭
  • JOOQ 忽略具有默认值的数据库列

    看来JOOQ完全忽略了数据库列的默认值 既不会更新 ActiveRecord 对象 也不会在 INSERT 时跳过此列 相反 它尝试将其设置为 NULL 这在 NOT NULL 列上失败 Example CREATE TABLE bug f