Jooq (java) - Тип класса org.jooq.impl.UnqualifiedName не поддерживается в диалекте DEFAULT - PullRequest
1 голос
/ 04 апреля 2019

Здравствуйте, я делаю это в методе

public void update(Table table, String tableName){
    ArrayList<Name> firstRowInDslFormat = new ArrayList<>();
    for (Object value : table.getTableDataInRowFormat(false).get(0))
        firstRowInDslFormat.add(DSL.name(value.toString()));

    for (int rowId = 1; rowId < table.getTableDataInRowFormat(false).size(); rowId++) {
        stringBuilder.append("\n" + ctx
             .update(DSL.table(DSL.name(tableName)))
             .set(
                 DSL.row(firstRowInDslFormat), 
                 DSL.row(table.getTableDataInRowFormat(false).get(rowId))
             )
             .where(...).getSQL(ParamType.INLINED) + ";");
    }  
}

getTableDataInRowFormat () возвращает Map (Integer, ArrayList) -> Map (rowId, значения столбца строки в строке)

Я не знаю, как это исправить.Я пытался, как вы видите при запуске метода, изменить тип с String на Name, но он выдает мне ошибку: Причина: org.jooq.exception.SQLDialectNotSupportedException: Тип класса org.jooq.impl.UnqualifiedName не поддерживается в диалекте DEFAULT

Когда я использую только строки, подобные этой:

 DSL.row(table.getTableDataInRowFormat(false).get(0)), 
 DSL.row(table.getTableDataInRowFormat(false).get(rowId))).where()...

это работает ... но возвращает мне имя столбца с '', как вы видите в выводе ниже ... и когда я запускаюэто приведет к ошибке из-за синтаксиса, где '' не ожидается.

Вывод, когда я использую только строки:

  1. update New_tab1 set 'id' = '0',' name '=' John 'где (id = 1);
  2. update New_tab1 set 'id' = '1', 'name' = 'Pierce' где (id = 2);

Я знаю, что эти темы уже созданыно это немного отличается, я думаю.

1 Ответ

2 голосов
/ 05 апреля 2019

Это определенно ограничение в API jOOQ. Вы должны быть в состоянии передать набор org.jooq.Name экземпляров (или org.jooq.Select экземпляров) в DSL.row(Collection<?>). Я создал проблему для этого: https://github.com/jOOQ/jOOQ/issues/8492

В качестве обходного пути используйте Field<?> экземпляры вместо Name экземпляров:

ArrayList<Field<?>> firstRowInDslFormat = new ArrayList<>();
for (Object value : table.getTableDataInRowFormat(false).get(0))
    firstRowInDslFormat.add(DSL.field(DSL.name(value.toString()), value.getClass()));
...