java - 没有 codegen 的 jOOQ H2 区分大小写问题

标签 java mysql relational-database h2 jooq

我一直在使用 Hibernate 对基于 MySQL 的应用程序的功能测试部分使用 H2。我终于受够了,我决定主要使用 jOOQ,这样我仍然可以从底层数据库中抽象出自己。

我的问题是我根本不喜欢 jOOQ 做的这种代码生成事情,因为我还没有看到在多个配置文件中正确设置它的示例,也不喜欢连接到数据库作为我的构建。总的来说,这是一个非常糟糕的设置,我不想花一个上午的时间来意识到它非常可怕,我不想在项目中使用它。

我正在使用 tableByName() 和 fieldByName(),我认为这是一个很好的解决方案,但我遇到了 H2 将所有内容都设为大写的问题。

如果我执行类似 Query deleteInclusiveQuery = jooqContext.delete(tableByName("inclusive_test"))... 的操作,我会发现未找到表 inclusive_test。请注意,这与连接延迟或关闭配置无关。

我尝试更改连接以使用 ;DATABASE_TO_UPPER=false 但后来我发现找不到字段(我认为它会转换所有模式)。

我不确定 H2 是否无法创建非大写模式,或者我在这方面失败了。如果是前者,那么我希望 jOOQ 也将查询中的表名和字段名大写。

示例输出为: 从“inclusive_test”中删除“segment_id”(从“segment”中选择“id”,其中“external_taxonomy_id”= 1) 如果没有像这样创建 H2 模式,这将是正确的,但是我正在创建模式的查询专门将其设置为小写,但最终它最终变成了大写,Hibernate 似乎理解或解决了这一点,但不是 jOOQ

无论如何,我想问一下是否有解决方案,因为我现在非常失望,我正在考虑放弃无法使用 Hibernate 的测试。

欢迎任何不使用代码生成功能的解决方案。

最佳答案

My problem is that I don't like this code generation thing jOOQ does at all since I'm yet to see an example with it properly set up in multiple profiles, also don't like connecting to the database as part of my build. It's overall quite a nasty set-up I don't to spend a morning doing to realise is very horrible and I don't want it in the project.

如果您这样做,您将错过大量很棒的 jOOQ 功能。看到这个非常有趣的讨论关于为什么在构建中有一个数据库连接不是那么糟糕的基本原理:

无论如何,不​​要太快感到沮丧。事情之所以按照现在的方式进行,有几个原因。 DSL.fieldByName()创建区分大小写的列。如果您提供小写的 "inclusive_test" 列,则 jOOQ 将默认使用引号和小写形式呈现名称。

您有多种选择:

  1. 一致地命名您的 MySQL 和 H2 表/列,明确指定大小写。例如。 MySQL 中的 `inclusive_test` 和 H2 中的 "inclusive_test"
  2. 使用jOOQ's Settings覆盖渲染行为。正如我所说,默认情况下,jOOQ 用引号呈现所有内容。您可以通过指定 RenderNameStyle.AS_IS 来覆盖它
  3. 使用DSL.field()而不是 DSL.fieldByName() 。它将允许您完全控制您的 SQL 字符串。

顺便说一句,我认为我们会更改手册以建议新用户使用 DSL.field() 而不是 DSL.fieldByName()。这整个区分大小写在过去引起了太多问题。这将通过 Issue #3218 完成

关于java - 没有 codegen 的 jOOQ H2 区分大小写问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23362782/

相关文章:

java - 避免 SocketTimeoutException 的最佳方法是什么?

java - 字符串连接真的那么慢吗?

java - Gradle Proguard 优化时出现大量内存错误

php - 一张表中可以添加两个同名字段吗?

java - Vaadin Sampler 中的 `ComponentRenderer` 是什么类?

php - 使用 Ajax 或 JavaScript 选择下拉列表选项后在同一页面上执行 PHP 脚本

mysql - MySQL bigint转UUID的存储过程

mysql - 在 mySQL 中计算诊所患者预约日期之间的时间间隔

php - 使用外键从表中获取数据 PHP MySQL

database - 是否有一个轻量级的数据库系统支持时间序列数据的插值和间隙?