我最初有以下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()的一些不同变体,试图强制它被识别但到目前为止还没有运气。
答案 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);