【问题标题】:jOOQ H2 Case sensitivity issues without codegenjOOQ H2 没有代码生成的区分大小写问题
【发布时间】:2014-06-15 06:43:16
【问题描述】:

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

我的问题是我根本不喜欢 jOOQ 所做的这种代码生成操作,因为我还没有看到在多个配置文件中正确设置它的示例,也不喜欢连接到数据库作为我的构建。总体而言,这是一个非常令人讨厌的设置,我不想花一个上午的时间来意识到这非常可怕,我不希望它出现在项目中。

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

如果我执行Query deleteInclusiveQuery = jooqContext.delete(tableByName("inclusive_test"))... 之类的操作,我会得到 table inclusive_test not found。请注意,这与连接延迟或关闭配置无关。

我尝试将连接更改为使用;DATABASE_TO_UPPER=false,但后来我发现未找到字段(我认为它会翻译所有架构)。

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

示例输出为: delete from "inclusive_test" where "segment_id" in (select "id" from "segment" where "external_taxonomy_id" = 1) 如果没有像这样创建 H2 模式,那将是正确的,但是我正在创建模式的查询专门将它放在小写字母中,但最终它最终变成大写字母,Hibernate 似乎可以理解或解决,但不是 jOOQ

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

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

【问题讨论】:

  • 我认为我们需要一个简单、完整、可重现的测试用例。
  • 是的,不幸的是,我的案例不是一个简单的案例,我必须制作它,底线是,使用原始准备好的语句不适用于 H2(除非您设法将模式小写) ,如果您使用 AS_IS 设置或设置 database_to_upper=false,jOOQ 似乎可以解决问题...我不太确定我是否了解驱动程序、jOOQ、架构或谁是大写和小写哪个东西...我觉得他们一开始就想把任何东西都大写是很愚蠢的:/

标签: java mysql relational-database h2 jooq


【解决方案1】:

我的问题是我根本不喜欢 jOOQ 所做的这种代码生成操作,因为我还没有看到在多个配置文件中正确设置它的示例,也不喜欢连接到数据库作为我的构建。总体而言,这是一个非常令人讨厌的设置,我不会花一个上午的时间来意识到这非常可怕,我不希望它出现在项目中。

如果您采用这种方式,您将错过大量令人敬畏的 jOOQ 功能。请参阅这个非常有趣的讨论,了解为什么在构建中拥有 DB 连接并没有那么糟糕:

无论如何,不​​要太快感到沮丧。事情以现在的方式完成有几个原因。 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 完成

【讨论】:

  • 我明确指定了 H2 中表的小写名称,我想也许驱动程序是大写的一切。我正在使用 spring jdbc:initialize 东西。关于构建中的数据库连接的事情至少在我的公司中,构建发生在一个随机的詹金斯盒子中,它没有特定的配置或连接。我不喜欢构建需要配置的想法。例如迁移,以及所有其他类似的事情都是通过外部部署脚本完成的,而不是在 Maven 中......我会继续尝试你的建议并回来
  • @fd8s0:另一种选择 (mentioned in this thread) 是在单独的环境中构建和签入数据库元数据库。仅仅因为构建基础设施而删除所有这些伟大的功能真的太糟糕了......但无论如何,这不是这里的问题。 Have you logged your SQL output yet? 渲染的大小写是否正确?
  • 我在问题中添加了更多内容,我不完全确定 jOOQ 在这里有错。我不太明白为什么 H2 全部大写。
  • 使用 renderNameStyle AS_IS 传递了表名,但得到了我org.h2.jdbc.JdbcSQLException: Column "NAME" not found; SQL statement: insert into segment (name) values (?),这与我尝试时得到的相同;DATABASE_TO_UPPER=false,我不会尝试理解为什么...因为 AS_IS 建议它应该保持查询小写,这是之前发生的事情?
  • 好的,值得一试。回到@ThomasMueller,然后
猜你喜欢
  • 2016-11-22
  • 2017-09-14
  • 2016-03-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-07
  • 1970-01-01
相关资源
最近更新 更多