Java 没有codegen的jOOQ H2案例敏感性问题

Java 没有codegen的jOOQ H2案例敏感性问题,java,mysql,relational-database,h2,jooq,Java,Mysql,Relational Database,H2,Jooq,我在Hibernate的基于MySQL的应用程序的功能测试部分使用了H2。我终于受够了它,我决定使用usq jOOQ,这样我仍然可以从底层数据库中提取自己 我的问题是,我根本不喜欢jOOQ所做的代码生成工作,因为我还没有看到在多个概要文件中正确设置它的示例,也不喜欢将连接到数据库作为构建的一部分。总的来说,这是一个相当糟糕的设置,我不想花一个上午去做,因为我意识到这是非常可怕的,我不想在项目中使用它 我用tableByName()和fieldByName()来代替它,我认为这是一个很好的解决方案

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

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

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

如果我执行类似于
querydeleteInclusiveQuery=jooqContext.delete(tableByName(“inclusive_test”)…
的操作,我会得到未找到的表inclusive_test。注意,这与连接延迟或关闭配置无关

我尝试将连接更改为使用
;数据库_TO_UPPER=false
,但随后我得到了未找到的字段(我认为它将转换所有模式)

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

示例输出为:
删除“包含性测试”中的“段id”(从“段”中选择“id”,其中“外部分类法id”=1)
如果H2模式不是这样创建的,这是正确的,但是我创建模式时使用的查询专门将其放在小写中,但最终它是大写的,Hibernate似乎理解或解决了这一点,但不是jOOQ

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

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

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

如果你这样做的话,你会错过很多很棒的jOOQ功能。请参阅这篇非常有趣的讨论,讨论了为什么在构建中使用DB连接没有那么糟糕的基本原理:

无论如何,不要太快感到沮丧。事情之所以如此,有几个原因。创建区分大小写的列。如果您提供了小写的
“inclusive_test”
列,那么jOOQ将默认使用引号和小写字母呈现名称

您有几个选择:

  • 统一命名MySQL和H2表/列,明确指定大小写。例如,MySQL中的
    `inclusive\u test`
    ,以及H2中的
    “inclusive\u test”
  • 用于替代渲染行为。正如我所说,默认情况下,jOOQ使用引号呈现所有内容。可以通过指定
  • 请改用
    DSL.fieldByName()
    。它将允许您完全控制SQL字符串

  • 顺便说一下,我想我们会修改手册,建议新用户使用
    DSL.field()
    而不是
    DSL.fieldByName()
    。整个案件敏感性在过去造成了太多问题。这将通过

    完成。我认为我们需要一个简单、完整、可复制的测试用例。是的,不幸的是,我的用例不是一个简单的用例,我必须生成它,底线是,使用原始准备的语句将不适用于H2(除非您设法降低模式的大小写),如果您使用AS_IS setting或将database_设置为_upper=false,那么jOOQ似乎可以做到这一点。。。我不太相信我能理解司机,jOOQ,schema,或者谁是上下两个外壳中的哪一个。。。我认为他们一开始就认为任何东西都要大写是很愚蠢的:/我在H2中明确指定了表的小写名称,我认为可能驱动程序是大写的。我正在使用SpringJDBC:初始化东西。关于构建上的数据库连接,至少在我的公司,构建是在随机的jenkins框中进行的,没有特定的配置或连接。我不喜欢建筑需要配置的想法。e、 迁移和所有其他类似的事情都是通过外部部署脚本完成的,而不是在maven中。。。我会继续尝试你的建议,然后再来back@fd8s0:另一个选项()是在单独的环境中构建和签入数据库元数据库。仅仅因为构建基础设施就删除所有这些伟大的功能实在太糟糕了。。。但无论如何,这不是问题所在。它呈现的是正确的外壳吗?我在问题中添加了更多的内容,我不完全确定jOOQ是否有错。我不太明白为什么H2大写everything.using renderNameStyle AS_IS会通过表名,但得到我
    org.H2.jdbc.JdbcSQLException:找不到列“name”;SQL语句:插入段(
    name
    )值(?)
    ,这与我尝试时得到的值相同;DATABASE_TO_UPPER=false,我不想试图理解为什么。。。因为正如_IS所建议的,它应该保持查询的大小写较低,这是以前发生的事情吗?好的,值得一试。那么回到@ThomasMueller