jOOQ - DefaultRecordMapper - 区分大小写

jOOQ - DefaultRecordMapper - Case sensitivity

DefaultRecordMapper 可以不区分大小写吗?

问题的原因是 OracleH2 具有默认行为 如果未引用,则包含迷人的标识符(参见 https://seeq.atlassian.net/wiki/spaces/KB/pages/443088907/SQL+Column+Names+and+Case+Sensitivity and https://community.oracle.com/tech/developers/discussion/895094/is-there-anyway-to-make-oracle-field-names-case-insensitive-or-is-it-just)。与 SQL Server 不同,后者在创建 table 时使用区分大小写。

SQL 输出的区分大小写与 Oracle 和 H2 的 POJO 字段不匹配。

我能想到的唯一 2 个解决方案是:

然而,第一种解决方案有一个缺点。如果使用 fetch 而不是 fetchInto 来处理原始数据 结果,列值的 get 方法也需要别名。所以,开发人员需要知道那里 是仅对 fetchInto 使用辅助方法和对 fetch.

使用普通 select 之间的区别

我错过了什么吗?有没有 better/easier 的解决方案?

我找到了 https://www.jooq.org/doc/latest/manual/sql-building/dsl-context/custom-settings/settings-name-style/ 但这并不能解决问题。

你不能让 DefaultRecordMapper 不区分大小写,目前 (jOOQ 3.16) 没有这样的配置,并且没有任何实施这个的计划,因为它似乎没有必要,除了像你这样的边缘情况.

一些需要:

解决根本问题:命名不一致

  • 如果您的数据库列称为 ITEMUNIT,那么为什么不将您的属性称为 itemunit?这是最规范的翻译。把那个人为的骆驼装在这里,但蛇装在那里,你并没有真正得到多少
  • 如果您的属性确实需要被称为 itemUnit,那么为什么不一致地将您的数据库列也命名为 ITEM_UNIT

在上述两种方法中,您不需要不区分大小写作为解决方法,而是在您的数据库和应用程序中使用一致的命名。

解决命名不一致问题

如果上述方法不可行,您仍然可以使用各种方法来解决此问题:

  • 您可以使用 JOOQ 支持的 JPA @Column 注释来注释您的属性
  • 您可以使用视图或计算列为每个人
  • “修复”数据库和项目中错误选择的名称ITEMUNIT AS ITEM_UNIT
  • 您确实可以在每次使用反射 DefaultRecordMapper 时手动为列添加别名,但这很费力(您不必为 所有 列添加别名,只需为那些命名不一致)
  • 您可以使用 RecordMapperProvider
  • 覆盖 DefaultRecordMapper 行为
  • 您可以避免使用反射映射并使用映射对象

但在所有这一切中,我认为潜在的问题是命名不一致。如果您只是一致地命名 column/attribute 会容易得多。进行这种特殊区分没有任何价值,只会带来麻烦。