当前位置: 首页 > 知识库问答 >
问题:

让jOOQ不生成编号字段和组件

梁丘威
2023-03-14

有没有办法强制jOOQ只按名称引用列,而不按索引引用列,并且不生成任何依赖于索引而不是名称的函数或属性?

我在jooq.org高级代码生成页面转了一圈,没有立即看到任何东西。希望我只是错过了。

出身背景

我开始jOOQ一个新的项目与现有的生产数据库比遭受一些手动DDL修改,特别是一些ALTER TABLE ADD COLUMN行李。因此,我的liquibase表定义在顺序上与实际生产定义不匹配。

我希望能够根据模式更改从头开始创建开发数据库,而不会有任何风险,即开发人员通过索引引用无效的列。

当我针对dev数据库生成代码时,我注意到当前生成的对象(基于生产数据库)在索引值和属性顺序方面存在许多差异。我几乎可以肯定这是因为数据库虽然有相同的列名,但顺序不同。

共有1个答案

符修杰
2023-03-14

jOOQ内部使用列索引而不是名称,原因很简单:

  1. 不是所有的JDBC驱动程序都正确支持JDBC的ResultSet中的命名列,但是它们都支持索引列
  2. 通过索引查找Object[]中的值在热循环中比在Map中查找该值快得多

由于这些原因,将jOOQ记录基于字段名而不是字段索引是不明智的。这也转化为代码生成器。投影SELECT*时,列的顺序可能与某些用例相关,例如与联合操作符相关。SQL标准指定了联合对应的,其中联合基于子查询的列名,而不是它们的索引。但据我所知,没有任何RDBMS支持这种语法。您可以按以下方式订购

如果不依赖于以上内容,可以使用

它必须实现比较器。因此,对于按字母顺序排列的简单情况,请写下:

public class AlphabeticOrderProvider implements Comparator<Definition> {
    @Override
    public int compare(Definition o1, Definition o2) {
        return o1.getQualifiedInputName().compareTo(o2.getQualifiedInputName());
    }
}

并将其提供给代码生成配置:

<configuration>
  <generator>
    <database>
      <orderProvider>com.example.AlphabeticOrderProvider</orderProvider>
    </database>
  </generator>
</configuration>

您还可以直接在Liquibase迁移的基础上生成代码,每次在新模式上运行该迁移时,都应该生成相同的列顺序。从jOOQ 3.13开始(大约2020年第1季度),我们将支持以下现成的Liquibase

  • https://www.jooq.org/doc/3.13/manual/code-generation/codegen-liquibase

其工作方式是jOOQ启动一个H2内存数据库,并在该数据库上运行整个Liquibase迁移,而不是在实际数据库上运行,Liquibase负责方言不可知性。我们还可以解析和转换您可能进行的任何本机SQL迁移。

这种方法显然假设您将签入生成的源,而不是在每个环境中重新生成它们。

 类似资料:
  • 我正在编写一个使用javafx FXML生成日志文件的程序。是否可以生成一组与仪器相关联的文本字段。示例:型号:Sn:Tg:Gas: 我需要收集每个仪器的信息,但有些地方有5个单位,有些只有1个。我正在寻找有字段生成从用户输入多少他们需要。这是我能做的吗?

  • 问题内容: 我正在尝试将jOOQ包含在我的代码中,但是未生成任何代码。 执行时,不会生成任何源。我希望它创建一个在以下-file文件中定义的类。 我的pom.xml文件如下所示: 我假设应该使用适当的类来创建目录。Maven构建成功运行,没有任何错误。 您可以在此GitHub存储库中找到整个项目。 问题答案: 您正在使用内存数据库:。jOOQ代码生成器启动时,它将接收到一个空的 新 数据库,而不是

  • Jooq不生成类。我使用gradle插件https://github.com/etiennestuder/gradle-jooq-plugin使用postgresql 42.2.24。我的问题是什么?这是我的身材 输出任务:生成Jooq 在2s中成功构建1个可操作任务:1个已执行

  • 我更改了数据库中的一些表,所以我想生成记录、键、类等。但是每次我这样做时,它总是跳过jooq代码生成。 [INFO]--jooq-codegen-maven:3.11.10:generate(默认cli)@http网关--[INFO]跳过jooq代码生成 为了运行Jooq代码生成,我应该执行哪个mvn cmd?现在我使用: 谢谢

  • 在我从在线材料中找到的以下jooq片段中,有一个从“jooq结束于此”到“流开始”的转换 这是否意味着SQL查询生成发生,直到取得()?之后stream()启动,一切都在java进程内存中 或者像active record DSL这样的java 8流和整个代码段是否转换为SQL查询,包括stream()部分? 这是因为我已经看到了示例,其中sortBy/group pingBy是在许多在线示例的流

  • 我试图使用JOOQ连接到HSQLDB,但我失败了,这里是错误消息: 此查询也会在HSQLDB Manager上失败(与JOOQ代码生成器的错误相同): 此查询工作正常: 我认为问题出在“cc”限定符上(在查询返回的“CONSTRAINT_NAME”字段上),这是HSQLDB错误吗? 我正在使用: HSQLDB 2.3.1 JOOQ 3.2.3 谢谢Ciccio