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

如何使用JOOQ在运行时重写表限定符

萧阳波
2023-03-14

当使用JOOQ为SQLServer数据库生成代码时,生成会创建由三部分组成的限定符,如:[catalog].[schema].[table]。这正是我在使用SQL服务器数据库时想要的,但是当使用生成的代码与另一个数据库(如内存数据库中的H2)进行单元测试时,这是一个问题。

H2方言不支持这些由三部分组成的限定词,H2期望类似于[目录]。[表]。这会在针对H2执行以下命令时导致语法错误:

context.createTable(TBLBUSINESSENTITY).columns(TBLBUSINESSENTITY.fields()).execute();

为了解决这个问题,我需要在运行时更改限定符,我认为可以使用渲染映射和映射模式来完成。不幸的是,这似乎只能像这样修改限定符的模式部分:

Settings settings = new Settings().withRenderMapping(new RenderMapping().withSchemata(
      new MappedSchema().withInput("dbo").withOutput("mySchema")));

给定限定符[MyDatabase].[dbo].[MyTable],这映射到[MyDatabase]。[MyTable]但我不知道如何完全删除该部分。

有没有办法重写映射到[MyDatabase]。[MyTable]

共有1个答案

南宫鸿晖
2023-03-14

请改用此设置:

java prettyprint-override">Settings settings = new Settings()
  .withRenderCatalog(false)
  .withRenderMapping(new RenderMapping()
    .withCatalogs(new MappedCatalog()
      .withInput("MyDatabase")
      .withSchemata(new MappedSchema()
        .withInput("dbo")
        .withOutput("MyDatabase"))));
 类似资料:
  • 问题内容: 我正在使用jOOQ和一个临时表: 这使我可以编写简单的查询:DSL.select(TYPE,TOKEN).from(TMP)… 但是,当我尝试针对另一个表进行联接时,由于列名并且不具有表名的限制(即,我需要生成的代码看起来像),这会造成歧义。是否可以通过使Jooq理解temp表具有某些列,或通过使用具有限定名称的a来实现此目的? 当然,对于查询的这些部分,我总是可以使用原始SQL,这是

  • 问题内容: 使用JPA EntityManager和JPA Query对象,如何覆盖带有注释@OneToMany(fetch = FetchType.EAGER)的对象,以便在查询中延迟获取? 如果我有hibernate的Query对象,则可以让它创建一个条件对象,并使用此对象将获取类型设置为惰性。但是我必须使用JPA Query对象。这个问题有什么解决办法吗? 问题答案: 即使使用本地Hiber

  • 对于多个数据库(和数据库服务器),我有完全相同的数据库定义。我如何告诉Jooq使用与我创建的连接到DB的“连接”相同的数据库? 示例(对于MySQL): jdbc:mysql://localhost:3306/tsm-我的开发数据库(tsm),用于生成代码 所有3个数据库都具有相同的定义、相同的表、索引等。TSM one是我们的应用程序使用的标准。 也许我应该使用DSL。使用(连接、设置)而不是?

  • 我正试图将这个查询转换为jOOQ,但遇到了用于将值连接到数组的“”。 如何将值连接到数组?

  • 我创建了一个Spring Boot far-jar,其中包含一个log4j.xml配置文件作为资源。现在,当我运行fat-jar时,我试图以这种方式覆盖它 我在文件夹中放入了一个新的log4j.xml。但是什么都没有,它继续使用JAR中的资源。

  • 我有一个数据库(postgresql)与表Cdr。每个月都会在数据库中创建一个新表,该表具有与Table Cdr相同的模式,名为Cdr__(例如。Cdr_2016_04)。 我试图使用Jooq查询数据库,基于提供的日期。麻烦的是: 不起作用,因为它表明 组织。约克。例外DataAccessException:。。。来自cdr_2017_01,其中“公共”、“cdr”、“field1”和“公共”、“