2

PostgreSQL 中有一个带有 ltree 字段的表。如何使用字符串值更新此字段?

DSL.using(configuration)
.update(AREAS)
.set(AREAS.TREE, area.getTree());//getTree() return String

我尝试了几种变体:

  1. val(area.getTree()).cast(field("ltree"))投掷

    A org.jooq.exception.DataAccessException has been caught, 
    SQL [update "public"."areas" set "tree" = cast(? as any) where "public"."areas"."id" = ?]; 
    ERROR: syntax error at or near "any"*
    
  2. inline(String.format("CAST(\'%s\' AS ltree)", area.getTree()))使用多余的引号

    A org.jooq.exception.DataAccessException has been caught, 
    SQL [update "public"."areas" set "tree" = 'CAST(''1.35.1284739'' AS ltree)' where "public"."areas"."id" = ?]; 
    ERROR: syntax error at position 4*
    
  3. val(field("CAST({0} AS ltree)", area.getTree()))投掷

    A org.jooq.exception.SQLDialectNotSupportedException has been caught, 
    Type class org.jooq.impl.SQLField is not supported in dialect DEFAULT
    
4

1 回答 1

1

彻底解决

从长远来看,添加对特定于供应商的数据类型的支持的最佳方法是为其指定自定义数据类型绑定,这允许您定义 jOOQ 应如何将类型序列化/反序列化到 JDBC API,包括强制转换你可能需要。

一个快速的胜利可能是这些:

field("CAST(? as ltree)", area.getTree());
field("CAST({0} as ltree)", val(area.getTree()));

这就是为什么您的各种尝试都不起作用的原因:

val(area.getTree()).cast(field("ltree"))

这种方法起初似乎很有意义,因为您使用的是 jOOQ 的内置cast()支持。但是,您的field("ltree")表达式建模了一个名为 ltree未知类型的字段,因此当您将其传递给 时cast(),jOOQ 不知道将其val转换为什么,因此:any

inline(String.format("CAST(\'%s\' AS ltree)", area.getTree()))

这在您的上下文中实际上没有意义,因为DSL.inline()创建了一个内联绑定变量、常量或字符串文字(同一概念的所有不同名称)。你不想要字符串文字'CAST(... AS ltree)',你想要表达式CAST(... AS ltree)

val(field("CAST({0} AS ltree)", area.getTree()))

这与上述类似,尽管您离这里很近。内部field(...)表达式创建了一个 SQL 模板,这正是您想要的。但是随后您使用 将其包装在绑定变量中DSL.val(),这实际上没有意义,原因有两个:

  • 您不希望您的强制转换表达式成为绑定变量
  • 强制转换表达式(类型Field)不是创建绑定变量的有效类型。jOOQ 不知道如何绑定类型的值Field
于 2017-11-08T09:44:17.660 回答