Как я могу абстрагировать схему с помощью jOOQ?

Я пытался следовать инструкции по отображению схемы в jOOQ.

Во-первых, я начинаю с квалифицированного имени и таблицы:

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 для сопоставления в зависимости от целевой среды.


person John Freeman    schedule 25.08.2017    source источник
comment
Верна ли ваша схема имени схемы?   -  person Amogh    schedule 25.08.2017
comment
схема не существует в базе данных. Я просто использую имя в качестве заполнителя для заполнения фактической схемой, когда мне нужна строка SQL.   -  person John Freeman    schedule 25.08.2017


Ответы (1)


Это известная проблема: https://github.com/jOOQ/jOOQ/issues/5344< /а>

Начиная с jOOQ 3.9.5, сопоставление схем и сопоставление таблиц не применяются к простым таблицам SQL и таблицам с пользовательскими именами. Хотя сопоставление с простыми строками SQL не применяется, последнее исправлено в jOOQ 3.10.

Есть два обходных пути:

Вы можете выполнить сопоставление вручную

Вы полностью контролируете построение ссылки на таблицу и можете явно отображать таблицу как таковую:

Name myTableName = DSL.name(schema(), "myTable");

А потом:

public String schema() {
    if (something)
        return "schema";
    else
        return "PUBLIC";
}

Используйте CustomTable

Менее известная функция — это CustomTable. которые можно использовать вместо сгенерированных таблиц, если вы не используете генератор кода jOOQ. Это требует немного больше усилий, чем обычная таблица SQL или именованная таблица, но если вы можете абстрагироваться от конструкции таблицы, это может быть оправдано, потому что CustomTable позволяет легко. Пример:

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;
    }
}
person Lukas Eder    schedule 25.08.2017