Java JOOQ:默认情况下不支持类型类org.JOOQ.impl.SelectImpl
关于在JooqDSL中编写查询的问题 我有一些存储在Oracle数据库中的客户端属性列表 表结构如下:Java JOOQ:默认情况下不支持类型类org.JOOQ.impl.SelectImpl,java,oracle,jooq,Java,Oracle,Jooq,关于在JooqDSL中编写查询的问题 我有一些存储在Oracle数据库中的客户端属性列表 表结构如下: CLIENT\u ATTRIBUTE\u DICT(ID、代码、默认值)-所有可能属性的列表 客户端属性(属性ID、客户端ID、值)-不同客户端的属性值 我正在尝试为给定的客户端选择所有现有属性(在dict中)的值: 如果给定clientId的CLIENT_属性中存在行,则属性值=CLIENT_属性.valueelseCLIENT_属性\u DICT.DEFAULT_值 我的SQL查询(工
(ID、代码、默认值)-所有可能属性的列表CLIENT\u ATTRIBUTE\u DICT
(属性ID、客户端ID、值)-不同客户端的属性值客户端属性
CLIENT_属性.value
elseCLIENT_属性\u DICT.DEFAULT_值
我的SQL查询(工作正常):
我在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);
clientattributedtictable dict=CLIENT_ATTRIBUTE_dict.as(“d”);
地图属性=
dsl.select(
dict.CODE,
DSL.nvl(
dsl.select(客户端属性值)
.from(客户端属性)
.在哪里(
客户属性属性ID相等(dict.ID),
客户端属性。客户端ID.eq(客户端ID)
),
dsl.select(客户端属性默认值)
.from(客户机属性)
.where(客户\属性\指令ID.eq(指令ID))
).作为(“价值”)
).来自(dict)
.fetchMap(String.class,String.class);
运行jooq查询时失败,并显示错误消息:
原因:默认情况下不支持类型类org.jooq.impl.SelectImpl
在org.jooq.impl.DefaultDataType.getDataType(DefaultDataType.java:757)~[na:na]在org.jooq.impl.DefaultDataType.getDataType(DefaultDataType.java:704)~[na:na]
在org.jooq.impl.DSL.getDataType(DSL.java:14378)~[na:na]
在org.jooq.impl.DSL.val(DSL.java:12766)~[na:na]
在org.jooq.impl.Utils.field(Utils.java:802)~[na:na]
在org.jooq.impl.DSL.nvl(DSL.java:8403)~[na:na] 我做错了什么 UPD JOOQ版本3.7.2我找到了解决办法 首先,我重写了SQL查询:
SELECT D.CODE, NVL(S.VALUE, D.DEFAULT_VALUE) ATTRIBUTE_VALUE
FROM CLIENT_ATTRIBUTE_DICT D
LEFT JOIN
(SELECT DD.ID,
A.VALUE
FROM CLIENT_ATTRIBUTE_DICT DD
JOIN CLIENT_ATTRIBUTE A
ON A.ATTRIBUTE_ID = DD.ID
WHERE A.CLIENT_ID = 1
) S ON S.ID = D.ID;
然后我用JOOQ dsl表达我的疑问:
String ID_FIELD_NAME = "ID";
String VALUE_FIELD_NAME = "VALUE"
ClientAttributeDictTable DICT_ATTRIBUTES = CLIENT_ATTRIBUTE_DICT.as("D");
Table<Record2<Long, String>> EXISTING_ATTRIBUTES =
dsl.select(CLIENT_ATTRIBUTE_DICT.ID, CLIENT_ATTRIBUTE.VALUE)
.from(CLIENT_ATTRIBUTE_DICT)
.join(CLIENT_ATTRIBUTE)
.on(CLIENT_ATTRIBUTE.ATTRIBUTE_ID.eq(CLIENT_ATTRIBUTE_DICT.ID))
.where(CLIENT_ATTRIBUTE.CLIENT_ID.eq(clientId))
.asTable("S", ID_FIELD_NAME, VALUE_FIELD_NAME);
Field<String> ATTRIBUTE_VALUE_FIELD =
nvl(
EXISTING_ATTRIBUTES.field(VALUE_FIELD_NAME, String.class),
DICT_ATTRIBUTES.DEFAULT_VALUE
).as("ATTRIBUTE_VALUE");
Map<String,String> attributes =
dsl.select(DICT_ATTRIBUTES.CODE, ATTRIBUTE_VALUE_FIELD)
.from(DICT_ATTRIBUTES)
.leftJoin(EXISTING_ATTRIBUTES)
.on(DICT_ATTRIBUTES.ID
.eq(EXISTING_ATTRIBUTES.field(ID_FIELD_NAME, Long.class))
)
.fetchMap(DICT_ATTRIBUTES.CODE, ATTRIBUTE_VALUE_FIELD);
如有任何改进我工作环境的想法,我们将不胜感激 我找到了解决办法
首先,我重写了SQL查询:
SELECT D.CODE, NVL(S.VALUE, D.DEFAULT_VALUE) ATTRIBUTE_VALUE
FROM CLIENT_ATTRIBUTE_DICT D
LEFT JOIN
(SELECT DD.ID,
A.VALUE
FROM CLIENT_ATTRIBUTE_DICT DD
JOIN CLIENT_ATTRIBUTE A
ON A.ATTRIBUTE_ID = DD.ID
WHERE A.CLIENT_ID = 1
) S ON S.ID = D.ID;
然后我用JOOQ dsl表达我的疑问:
String ID_FIELD_NAME = "ID";
String VALUE_FIELD_NAME = "VALUE"
ClientAttributeDictTable DICT_ATTRIBUTES = CLIENT_ATTRIBUTE_DICT.as("D");
Table<Record2<Long, String>> EXISTING_ATTRIBUTES =
dsl.select(CLIENT_ATTRIBUTE_DICT.ID, CLIENT_ATTRIBUTE.VALUE)
.from(CLIENT_ATTRIBUTE_DICT)
.join(CLIENT_ATTRIBUTE)
.on(CLIENT_ATTRIBUTE.ATTRIBUTE_ID.eq(CLIENT_ATTRIBUTE_DICT.ID))
.where(CLIENT_ATTRIBUTE.CLIENT_ID.eq(clientId))
.asTable("S", ID_FIELD_NAME, VALUE_FIELD_NAME);
Field<String> ATTRIBUTE_VALUE_FIELD =
nvl(
EXISTING_ATTRIBUTES.field(VALUE_FIELD_NAME, String.class),
DICT_ATTRIBUTES.DEFAULT_VALUE
).as("ATTRIBUTE_VALUE");
Map<String,String> attributes =
dsl.select(DICT_ATTRIBUTES.CODE, ATTRIBUTE_VALUE_FIELD)
.from(DICT_ATTRIBUTES)
.leftJoin(EXISTING_ATTRIBUTES)
.on(DICT_ATTRIBUTES.ID
.eq(EXISTING_ATTRIBUTES.field(ID_FIELD_NAME, Long.class))
)
.fetchMap(DICT_ATTRIBUTES.CODE, ATTRIBUTE_VALUE_FIELD);
如有任何改进我工作环境的想法,我们将不胜感激 错误是双重的
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")
nvl()
API总是以编译的方式重载。这是一个问题,将在将来的版本(可能是jOOQ 3.9)中修复这个错误是双重的
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")
nvl()
API总是以编译的方式重载。这是一个问题,将在将来的版本(可能是jOOQ 3.9)中修复您可以粘贴完整的堆栈跟踪(或者至少是相关的部分)来查看引发异常的位置吗?还有:你用的是什么jOOQ版本?嗨,卢卡斯!我更新了我的问题。你能粘贴完整的堆栈跟踪(或者至少是相关的部分)来查看引发异常的位置吗?还有:你用的是什么jOOQ版本?嗨,卢卡斯!我更新了我的问题。