Jooq(java)-方言DEFAULT

时间:2019-04-04 16:00:47

标签: java sql jooq

你好,我在方法中这样做

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()...

它可以工作...但是它返回的列名带有'',如您在下面的输出中所看到的...并且当我运行它时,由于语法的原因,它会引发错误,其中''不会出现。

  

仅使用字符串时的输出:

     
      
  1. 更新New_tab1设置'id'='0','name'='John'其中(id = 1);
  2.   
  3. 更新New_tab1设置'id'='1','name'='Pierce'其中(id = 2);
  4.   

我知道已经创建了这个主题,但是我认为它有点不同。

1 个答案:

答案 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()));