gpt4 book ai didi

java - JOOQ:方言 DEFAULT 不支持类型类 org.jooq.impl.SelectImpl

转载 作者:太空宇宙 更新时间:2023-11-04 12:32:54 25 4
gpt4 key购买 nike

我关于在 jooq dsl 中编写查询的问题。

我在 Oracle 数据库中存储了一些客户端属性列表。

表结构如下:

  • CLIENT_ATTRIBUTE_DICT (ID、CODE、DEFAULT_VALUE) - 所有可能属性的列表
  • CLIENT_ATTRIBUTE (ATTRIBUTE_ID、CLIENT_ID、VALUE) - 不同客户端的属性值

我正在尝试为给定客户端选择所有现有属性(在字典中)的值:

如果 CLIENT_ATTRIBUTE 中存在具有给定 clientId 的行,则属性值 = CLIENT_ATTRIBUTE.VALUE否则CLIENT_ATTRIBUTE_DICT.DEFAULT_VALUE

我的 SQL 查询(工作正常):

SELECT d.code,
NVL
(
(
SELECT value
FROM CLIENT_ATTRIBUTE a
WHERE a.ATTRIBUTE_ID = d.id
AND a.CLIENT_ID = 1
),
(
SELECT DEFAULT_VALUE
FROM CLIENT_ATTRIBUTE_DICT dd
WHERE dd.id=d.id
)
) value
FROM CLIENT_ATTRIBUTE_DICT d;

我在 Jooq dsl 中的查询:

ClientAttributeDictTable dict = CLIENT_ATTRIBUTE_DICT.as("d");
Map<String, String> attributes =
dsl.select(
dict.CODE,
DSL.nvl(
dsl.select(CLIENT_ATTRIBUTE.VALUE)
.from(CLIENT_ATTRIBUTE)
.where(
CLIENT_ATTRIBUTE.ATTRIBUTE_ID.eq(dict.ID),
CLIENT_ATTRIBUTE.CLIENT_ID.eq(clientId)
),

dsl.select(CLIENT_ATTRIBUTE_DICT.DEFAULT_VALUE)
.from(CLIENT_ATTRIBUTE_DICT)
.where(CLIENT_ATTRIBUTE_DICT.ID.eq(dict.ID))
).as("value")
).from(dict)
.fetchMap(String.class, String.class);

当 jooq 查询运行时,它失败并显示错误消息:

Caused by: Type class org.jooq.impl.SelectImpl is not supported in dialect DEFAULT

at org.jooq.impl.DefaultDataType.getDataType(DefaultDataType.java:757) ~[na:na]
at org.jooq.impl.DefaultDataType.getDataType(DefaultDataType.java:704) ~[na:na]
at org.jooq.impl.DSL.getDataType(DSL.java:14378) ~[na:na]
at org.jooq.impl.DSL.val(DSL.java:12766) ~[na:na]
at org.jooq.impl.Utils.field(Utils.java:802) ~[na:na]
at org.jooq.impl.DSL.nvl(DSL.java:8403) ~[na:na]

我做错了什么?

UPDJOOQ版本3.7.2

最佳答案

这个错误有两个方面。

  1. 当前不支持您的 API 使用(jOOQ 目前不接受 nvl() 函数中的 Select 类型)。改为这样写:

    DSL.nvl(
    DSL.field(dsl.select(CLIENT_ATTRIBUTE.VALUE)
    // ^^^^^^^^^ explicitly wrap the Select in a Field
    .from(CLIENT_ATTRIBUTE)
    .where(
    CLIENT_ATTRIBUTE.ATTRIBUTE_ID.eq(dict.ID),
    CLIENT_ATTRIBUTE.CLIENT_ID.eq(clientId))),

    DSL.field(dsl.select(CLIENT_ATTRIBUTE_DICT.DEFAULT_VALUE)
    // ^^^^^^^^^ explicitly wrap the Select in a Field
    .from(CLIENT_ATTRIBUTE_DICT)
    .where(CLIENT_ATTRIBUTE_DICT.ID.eq(dict.ID)))
    ).as("value")
  2. jOOQ(或者更确切地说,Java 编译器)无法检测到此 API 误用,因为 nvl() API 以始终编译的方式重载。这是问题https://github.com/jOOQ/jOOQ/issues/5340并将在未来版本(可能是 jOOQ 3.9)中修复

关于java - JOOQ:方言 DEFAULT 不支持类型类 org.jooq.impl.SelectImpl,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37656770/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com