使用 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
我正在尝试编写一个 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)
结果查询与使用相同的空搜索结果
已解决:使用此方法,将 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