PostgreSQL中有一个带有ltree字段的表。如何使用字符串值更新此字段?
DSL.using(configuration)
.update(AREAS)
.set(AREAS.TREE, area.getTree());//getTree() return String
我尝试了几种变体:
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"*
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*
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
答案 0 :(得分:1)
从长远来看,添加对特定于供应商的数据类型的支持的最佳方法是为其指定custom data type binding,这允许您定义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")
表达式会为未知类型的 {/ em> 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