jOOQ - DefaultRecordMapper - 区分大小写
jOOQ - DefaultRecordMapper - Case sensitivity
DefaultRecordMapper
可以不区分大小写吗?
问题的原因是 Oracle
和 H2
具有默认行为
如果未引用,则包含迷人的标识符(参见 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 个解决方案是:
- 通过自己的辅助方法为每列加上引号以确保正确区分大小写 (
ITEMUNIT as "itemUnit"
)。
- 实现一个不区分大小写的自己的记录映射器。
然而,第一种解决方案有一个缺点。如果使用 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
行为
- 您可以避免使用反射映射并使用映射对象
- nested records and ad-hoc conversion
- 使用
Records::mapping
创建的自定义 RecordMapper
,例如fetch(mapping(POJO::new))
,假设您的 POJO 有一个接受所有字段的构造函数
但在所有这一切中,我认为潜在的问题是命名不一致。如果您只是一致地命名 column/attribute 会容易得多。进行这种特殊区分没有任何价值,只会带来麻烦。
DefaultRecordMapper
可以不区分大小写吗?
问题的原因是 Oracle
和 H2
具有默认行为
如果未引用,则包含迷人的标识符(参见 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 个解决方案是:
- 通过自己的辅助方法为每列加上引号以确保正确区分大小写 (
ITEMUNIT as "itemUnit"
)。 - 实现一个不区分大小写的自己的记录映射器。
然而,第一种解决方案有一个缺点。如果使用 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
注释来注释您的属性 - 您可以使用视图或计算列为每个人 “修复”数据库和项目中错误选择的名称
- 您确实可以在每次使用反射
DefaultRecordMapper
时手动为列添加别名,但这很费力(您不必为 所有 列添加别名,只需为那些命名不一致) - 您可以使用
RecordMapperProvider
覆盖 - 您可以避免使用反射映射并使用映射对象
- nested records and ad-hoc conversion
- 使用
Records::mapping
创建的自定义RecordMapper
,例如fetch(mapping(POJO::new))
,假设您的 POJO 有一个接受所有字段的构造函数
ITEMUNIT AS ITEM_UNIT
DefaultRecordMapper
行为
但在所有这一切中,我认为潜在的问题是命名不一致。如果您只是一致地命名 column/attribute 会容易得多。进行这种特殊区分没有任何价值,只会带来麻烦。