Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JOOQ:默认情况下不支持类型类org.JOOQ.impl.SelectImpl_Java_Oracle_Jooq - Fatal编程技术网

Java JOOQ:默认情况下不支持类型类org.JOOQ.impl.SelectImpl

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查询(工

关于在JooqDSL中编写查询的问题

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

表结构如下:

  • CLIENT\u ATTRIBUTE\u DICT
    (ID、代码、默认值)-所有可能属性的列表
  • 客户端属性
    (属性ID、客户端ID、值)-不同客户端的属性值
我正在尝试为给定的客户端选择所有现有属性(在dict中)的值:

如果给定clientId的CLIENT_属性中存在行,则属性值=
CLIENT_属性.value
else
CLIENT_属性\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); 

如有任何改进我工作环境的想法,我们将不胜感激

错误是双重的

  • 当前不支持您的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")
    
  • jOOQ(或者更确切地说,Java编译器)无法检测到该API的误用,因为
    nvl()
    API总是以编译的方式重载。这是一个问题,将在将来的版本(可能是jOOQ 3.9)中修复


  • 这个错误是双重的

  • 当前不支持您的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")
    
  • jOOQ(或者更确切地说,Java编译器)无法检测到该API的误用,因为
    nvl()
    API总是以编译的方式重载。这是一个问题,将在将来的版本(可能是jOOQ 3.9)中修复


  • 您可以粘贴完整的堆栈跟踪(或者至少是相关的部分)来查看引发异常的位置吗?还有:你用的是什么jOOQ版本?嗨,卢卡斯!我更新了我的问题。你能粘贴完整的堆栈跟踪(或者至少是相关的部分)来查看引发异常的位置吗?还有:你用的是什么jOOQ版本?嗨,卢卡斯!我更新了我的问题。