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

How can I call this jOOQ generated function taking a custom bound type?

我最初有以下 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();

这很好用。我需要 return 一个真实的设备对象而不是 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() 的几种不同变体,试图强制它被识别,但到目前为止还没有成功。

这可能是 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);