使用 Oracle RAW 类型的 JOOQ Where 子句

JOOQ Where clause using Oracle RAW type

我正在尝试编写一个 JOOQ 查询,它需要通过 UUID 进行搜索,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;
    }

我怀疑您是否将 UUID 存储为 uuid.getBytes()。调用 String.getBytes() 将产生字符串的 unicode 编码,这将是存储 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