【问题标题】:JOOQ Where clause using Oracle RAW type使用 Oracle RAW 类型的 JOOQ Where 子句
【发布时间】:2020-04-03 20:49:27
【问题描述】:

我正在尝试编写一个需要按 UUID 搜索的 JOOQ 查询,该 UUID 以 RAW 类型存储在 Oracle 数据库中。在 Jooq 生成的实体中,这些类型的字段被定义为字节数组。

简单地将字符串转换为字节数组并没有找到匹配的值: jooqQuery.addConditions(TABLE.UUID_COLUMN.eq(UUID_AS_STRING).getBytes()));

另一方面,将列名转换为字符串时:

jooqQuery.addConditions(TABLE.UUID_COLUMN.cast(String.class).eq(UUID_AS_STRING));

在运行时产生 jdbc 异常:

"class":"o.h.engine.jdbc.spi.SqlExceptionHelper","rest":"ORA-00906: missing left parenthesis\n"

是否有正确的方法来转换它以产生一个正常工作的有效 sql?

编辑:我也尝试过使用TABLE.UUID_COLUMN.getDataType().convert(UUID_AS_STRING) 生成的查询与使用相同的空搜索结果执行 getBytes() 相同

已解决:使用此方法,将 UUID 转换为正确的字节数组:

    private byte[] getUUIDtoBytes(UUID devId) {
        byte[] uuidBytes = new byte[16];
        ByteBuffer.wrap(uuidBytes)
                .order(ByteOrder.BIG_ENDIAN)
                .putLong(devId.getMostSignificantBits())
                .putLong(devId.getLeastSignificantBits());
        return uuidBytes;
    }

【问题讨论】:

    标签: java oracle blob jooq


    【解决方案1】:

    我怀疑您是否将 UUID 存储为 uuid.getBytes()。调用 String.getBytes() 将产生字符串的 unicode 编码,这将是存储 UUID 的一种浪费方式,该 UUID 已经是十六进制格式。 A more likely encoding is documented in this SO question here.

    无论如何,您都应该了解您的 UUID 值是如何存储和编码的,并重用该编码机制。使用 jOOQ,理想情况下,您可以将数据类型绑定或转换器附加到您的 UUID_COLUMN,这样您就不必在任何 jOOQ 查询中再次考虑这一点。更多关于这里的信息: https://www.jooq.org/doc/latest/manual/code-generation/custom-data-type-bindings

    【讨论】:

    • 谢谢卢卡斯!您的第一个链接包括转换为适当的编码转换为字节数组。自定义数据类型绑定似乎很有希望在所有域系统中构建一些通用转换机制。
    猜你喜欢
    • 2022-01-07
    • 2016-11-29
    • 2020-06-10
    • 2016-03-06
    • 2023-03-31
    • 1970-01-01
    • 1970-01-01
    • 2019-02-10
    • 2021-11-12
    相关资源
    最近更新 更多