首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >如何用jooq (postgresql)处理批执行过程中任意数组参数化存储函数?

如何用jooq (postgresql)处理批执行过程中任意数组参数化存储函数?
EN

Stack Overflow用户
提问于 2016-07-19 10:21:31
回答 1查看 150关注 0票数 0

我有如下所示的db模式:

代码语言:javascript
代码运行次数:0
运行
复制
CREATE FUNCTION public.some_fun(anyarray) RETURNS anyarray AS $$
  SELECT $1;
$$ LANGUAGE sql;

CREATE TABLE some_table (some_col int[]);

我在java中调用以下代码:

代码语言:javascript
代码运行次数:0
运行
复制
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无法推断数组类型。

有趣的是,下面的代码产生相同的查询并确实工作:

代码语言:javascript
代码运行次数:0
运行
复制
Query query = ctx.insertInto(Tables.SOME_TABLE)
    .values((Field) someFun(new Integer[]{1}));
query.execute();

我猜这个问题与jdbc如何处理批处理查询有关,除非jooq将不同的查询记录到它真正执行的内容。我使用以下代码找到了解决这个问题的方法:

代码语言:javascript
代码运行次数:0
运行
复制
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始终明确地键入强制转换值,但它似乎不起作用:

代码语言:javascript
代码运行次数:0
运行
复制
ctx.renderContext().castMode(RenderContext.CastMode.ALWAYS);
Query query = ctx.insertInto(Tables.SOME_TABLE)
    .values((Field) someFun(new Integer[]{1}));
ctx.batch(query).execute();

我真的需要用手动的丑陋的方式来做类型铸造吗?还是有更好的方法来处理这个问题?

更新

通过生成如下类型的强制转换字符串,可以减少这种类型的转换:

代码语言:javascript
代码运行次数:0
运行
复制
String.format("::%s[]", DefaultDataType.getDataType(SQLDialect.POSTGRES, Integer[].class).getCastTypeName())

不过,这只是一个解决办法。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-08-05 09:15:59

在jOOQ 3.8中,还不支持PostgreSQL的anyanyarray和其他多态数据类型。这里有一个挂起的特性请求:https://github.com/jOOQ/jOOQ/issues/5479

你的解决办法可能和现在一样好。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38455780

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档