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

我如何用Jooq抽象模式?

孙项禹
2023-03-14

首先,我从一个限定名和表开始:

Name myTableName = DSL.name("schema", "myTable");
Table<Record> myTable = DSL.table(myTableName);

然后我用模式映射构建上下文:

Configuration configuration = new DefaultConfiguration();
configuration.set(SQLDialect.HSQLDB);
Settings settings = new Settings()
    .withRenderNameStyle(RenderNameStyle.QUOTED)
    .withRenderSchema(true)
    .withRenderMapping(
        new RenderMapping()
            .withSchemata(
                new MappedSchema()
                    .withInput("schema")
                    .withOutput("PUBLIC")
            )
    );
configuration.set(settings);
return DSL.using(configuration);

然后构建一个SQL字符串来创建表:

context.createTable(myTable)....getSQL();
invalid schema name: schema in statement [create table "schema"."myTable"(
    ...

从更大的角度来看,我试图编写跨不同方言可移植的SQL,但我必须为其构建的每个环境都使用不同的模式。我试图在Java中抽象一个通用模式,然后可以使用jOOQ根据目标环境进行映射。

共有1个答案

季骏祥
2023-03-14

这是一个已知问题:https://github.com/jooq/jooq/issues/5344

从jOOQ 3.9.5开始,模式映射和表映射不应用于普通SQL表和自定义命名表。虽然不会有任何映射应用于普通SQL字符串,但后者在Jooq3.10中得到了修正。

有两种变通办法:

Name myTableName = DSL.name(schema(), "myTable");
public String schema() {
    if (something)
        return "schema";
    else
        return "PUBLIC";
}
public class BookRecord extends CustomRecord<BookRecord> {
    protected BookRecord() {
        super(BookTable.BOOK);
    }
}

public class BookTable extends CustomTable<BookRecord> {
    public static final BookTable                      BOOK       = new BookTable();

    public static final TableField<BookRecord, Short>  ID         
      = createField("ID", SQLDataType.SMALLINT, BOOK);
    public static final TableField<BookRecord, String> TITLE      
      = createField("TITLE", SQLDataType.VARCHAR, BOOK);

    protected BookTable() {
        super("BOOK", DSL.schema(DSL.name("schema")));
    }

    @Override
    public Class<? extends BookRecord> getRecordType() {
        return BookRecord.class;
    }
}
 类似资料:
  • 下面是抽象类的代码: 现在,我应该如何为编写单元测试,并且应该如何在中模拟会话? 我在Stackoverflow上尝试了不同的解决方案,但仍然无法模拟它并获得会话模拟。

  • 主要内容:介绍,实现,Shape.java,Rectangle.java,Square.java,Circle.java,Color.java,Red.java,Green.java,Blue.java,AbstractFactory.java,ShapeFactory.java,ColorFactory.java,FactoryProducer.java,AbstractFactoryPatternDemo.java抽象工厂模式(Abstract Factory Pattern)是围绕一个超级

  • 抽象工厂模式 亦称: Abstract Factory 意图 抽象工厂模式是一种创建型设计模式, 它能创建一系列相关的对象, 而无需指定其具体类。 问题 假设你正在开发一款家具商店模拟器。 你的代码中包括一些类, 用于表示: 1、一系列相关产品, 例如 椅子Chair 、 ​ 沙发Sofa和 咖啡桌Coffee­Table 。 2、系列产品的不同变体。 例如, 你可以使用 现代Modern 、 ​

  • 抽象工厂模式(Abstract Factory Pattern)是围绕一个超级工厂创建其他工厂。该超级工厂又称为其他工厂的工厂。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。 在抽象工厂模式中,接口是负责创建一个相关对象的工厂,不需要显式指定它们的类。每个生成的工厂都能按照工厂模式提供对象。 介绍 意图:提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。 主要

  • 简介 抽象工厂模式是一种软件开发设计模式。抽象工厂模式提供了一种方式,可以将一组具有同一主题的单独的工厂封装起来。在正常使用中,客户端程序需要创建抽象工厂的具体实现,然后使用抽象工厂作为接口来创建这一主题的具体对象。客户端程序不需要知道(或关心)它从这些内部的工厂方法中获得对象的具体类型,因为客户端程序仅使用这些对象的通用接口。抽象工厂模式将一组对象的实现细节与他们的一般使用分离开来。 简例 有个

  • 抽象工厂模式(Abstract Factory Pattern)是围绕一个超级工厂创建其他工厂。该超级工厂又称为其他工厂的工厂。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。 在抽象工厂模式中,接口是负责创建一个相关对象的工厂,不需要显式指定它们的类。每个生成的工厂都能按照工厂模式提供对象。 介绍 意图:提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。 主要