我有如下所示的db模式:
CREATE FUNCTION public.some_fun(anyarray) RETURNS anyarray AS $$
SELECT $1;
$$ LANGUAGE sql;
CREATE TABLE some_table (some_col int[]);
我在java中调用以下代码:
DSLContext ctx = ... // retrieve DSLcontext
Query query = ctx.insertInto(Tables.SOME_TABLE)
.values((Field) someFun(new Integer[]{1}));
ctx.batch(query).execute();
该代码生成一个异常:
org.postgresql.util.PSQLException:错误:无法确定多态类型,因为输入具有“未知”类型
产生的查询是:
插入“public”。“some_table”("some_col")值(“public”。“some_fun”({“1”}))
事实证明,jooq没有明确地进行{1}
数组的类型转换,而postgres无法推断数组类型。
有趣的是,下面的代码产生相同的查询并确实工作:
Query query = ctx.insertInto(Tables.SOME_TABLE)
.values((Field) someFun(new Integer[]{1}));
query.execute();
我猜这个问题与jdbc如何处理批处理查询有关,除非jooq将不同的查询记录到它真正执行的内容。我使用以下代码找到了解决这个问题的方法:
Query query = ctx.insertInto(Tables.SOME_TABLE)
.values(
(Field) someFun(
DSL.field(DSL.array(new Integer[]{1}).toString() + "::int[]")
)
);
ctx.batch(query).execute();
我还试图通过将强制转换模式设置为ALWAYS
来使jooq始终明确地键入强制转换值,但它似乎不起作用:
ctx.renderContext().castMode(RenderContext.CastMode.ALWAYS);
Query query = ctx.insertInto(Tables.SOME_TABLE)
.values((Field) someFun(new Integer[]{1}));
ctx.batch(query).execute();
我真的需要用手动的丑陋的方式来做类型铸造吗?还是有更好的方法来处理这个问题?
更新
通过生成如下类型的强制转换字符串,可以减少这种类型的转换:
String.format("::%s[]", DefaultDataType.getDataType(SQLDialect.POSTGRES, Integer[].class).getCastTypeName())
不过,这只是一个解决办法。
发布于 2016-08-05 01:15:59
在jOOQ 3.8中,还不支持PostgreSQL的any
、anyarray
和其他多态数据类型。这里有一个挂起的特性请求:https://github.com/jOOQ/jOOQ/issues/5479
你的解决办法可能和现在一样好。
https://stackoverflow.com/questions/38455780
复制相似问题