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

时间:2014-04-29 11:01:43

标签: java mysql relational-database h2 jooq

我在使用Hibernate的基于MySQL的应用程序的功能测试部分使用了H2。我终于厌倦了它,我决定使用usq jOOQ,所以我仍然可以从底层数据库中抽象出来。

我的问题是,我不喜欢jOOQ所做的代码生成事情,因为我还没有看到一个例子,它在多个配置文件中正确设置,也不喜欢连接作为我的构建的一部分到数据库。总的来说,我不想花一个上午的时间去实现这个非常糟糕的设置并且我不想在项目中使用它。

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

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

我尝试更改连接以使用;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的测试。

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

1 个答案:

答案 0 :(得分:5)

  

我的问题是,我不喜欢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. 来覆盖此设置
  4. 请改用DSL.field()代替DSL.fieldByName()。它将允许您完全控制SQL字符串。
  5. 顺便说一句,我们认为我们会更改手册,建议您向新用户使用DSL.field()而不是DSL.fieldByName()。整个案例敏感性在过去引起了太多问题。这将通过Issue #3218

    完成