如何调用此jOOQ生成的函数采用自定义绑定类型?

时间:2017-08-07 04:29:51

标签: jooq postgresql-9.6

我最初有以下SQL函数:

CREATE FUNCTION resolve_device(query JSONB) RETURNS JSONB...

以下代码调用jOOQ生成的方法:

final JsonArray jsonArray = jooqDWH.select(resolveDevice(queryJson)).fetchOne().value1().getAsJsonArray();
final JsonObject o = jsonArray.get(0).getAsJsonObject();

这很好用。我需要返回一个真实的设备对象而不是JSON blob,所以我将SQL函数更改为:

CREATE FUNCTION resolve_device(query JSONB) RETURNS SETOF device...

和代码:

final ResolveDeviceRecord deviceRecord = jooqDWH.fetchOne(resolveDevice(queryJson));

但是我遇到了运行时错误:

org.jooq.exception.SQLDialectNotSupportedException: Type class com.google.gson.JsonElement is not supported in dialect DEFAULT

我的代码的许多其他部分继续使用我将JsonElement转换为JSONB的自定义绑定正常工作,但是对此函数签名的更改导致它停止工作。

我尝试了DSL.field()和DSL.val()的一些不同变体,试图强制它被识别但到目前为止还没有运气。

1 个答案:

答案 0 :(得分:1)

这可能是jOOQ中的错误或代码生成器中的错误配置。一旦明确出错,我会更新我的答案。

解决方法:

与此同时,这是使用plain SQL的解决方法:

// Manually create a data type from your custom JSONB binding first:
final DataType<JsonObject> jsonb = SQLDataType.OTHER.asConvertedDataType(jsonBinding);

// Then, create an explicit bind variable using that data type:
final ResolveDeviceRecord deviceRecord = 
    jooqDWH.fetchOptional(table("resolve_device({0})", val(queryJson, jsonb)))
           .map(r -> r.into(ResolveDeviceRecord.class))
           .orElse(null);