你好,我在方法中这样做
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:方言DEFAULT不支持类型类org.jooq.impl.UnqualifiedName
当我只使用这样的字符串时:
DSL.row(table.getTableDataInRowFormat(false).get(0)),
DSL.row(table.getTableDataInRowFormat(false).get(rowId))).where()...
它可以工作...但是它返回的列名带有'',如您在下面的输出中所看到的...并且当我运行它时,由于语法的原因,它会引发错误,其中''不会出现。
仅使用字符串时的输出:
- 更新New_tab1设置'id'='0','name'='John'其中(id = 1);
- 更新New_tab1设置'id'='1','name'='Pierce'其中(id = 2);
我知道已经创建了这个主题,但是我认为它有点不同。
答案 0 :(得分:2)
这绝对是jOOQ API中的限制。您应该能够将一组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()));