rawToHex(sys_guid()) 在 h2 中的 oracle 模式下的内存用法



我正在尝试为我的java应用程序编写一些测试,我的实体持久性使用oracle的sys_guid((作为主键。连接到 oracle 时一切正常,但是当我在内存中使用 H2 进行测试时,以下用于将主要 guid 值生成为 char(32( 的语句返回一个更大的字符串 (144(。

select rawtohex(sys_guid()) from dual

是否有额外的配置可以正确设置预言机模式,或者这在某种程度上是一个错误

我正在使用带有 spring-data 和休眠的 springboot 来处理数据库通信,这是一个生成 guid 的示例方法。

@Repository
public interface TokenRecuperacaoSenhaRepository extends ExtendedSpringRepo<TokenRecuperacaoSenha, String>
{
    @Query(value = "select rawtohex(sys_guid()) from dual", nativeQuery = true)
    public String genereateToken();
}

连接到 Oracle 时,返回"8E0FFC48082AB39FE0539BD3E10AC537"使用 H2 时,返回">

00660032003300620037003000360065002d0031006400630066002d0034003700620030002d0039003400360066002d00610062006500340032003400640036003000630006300360038">

我猜所使用的函数存在一些转换问题。

SYS_GUID()RAWTOHEX()函数都是非标准的,在Oracle和H2之间并不完全兼容。

此不兼容性已在 H2 的 Oracle 兼容模式下修复,因此,如果可以从其当前源构建 H2,则可以在此兼容模式下使用这些函数。

您可以从 GitHub 获取源代码:https://github.com/h2database/h2database

构建说明如下:https://h2database.com/html/build.html#building

你需要 jar 目标。

不要忘记通过将;MODE=Oracle追加到连接 URL 或使用SET MODE Oracle;命令来设置兼容模式。

如果您不能使用自己的 H2 版本,则需要一种 H2 的替代方法,该方法将使用类似 SELECT CAST(CAST(UUID() AS BINARY) AS VARCHAR)

最新更新