h2 - 使用 oracle 模式在内存中 h2 中的 rawToHex(sys_guid()) 用法
问题描述
我正在尝试为我的 java 应用程序编写一些测试,并且我的实体持久性使用 oracle 的 sys_guid() 作为主键。连接到 oracle 时一切正常,但是当我在内存中使用 H2 进行测试时,以下用于将主 guid 值生成为 char(32) 的语句返回一个更大的字符串 (144)。
select rawtohex(sys_guid()) from dual
是否有额外的配置来正确设置 oracle 模式,或者这是否是一个错误
我正在使用带有 spring-data 和 hibernate 的 springboot 来处理数据库通信,这是一个生成 guid 的示例方法。
@Repository
public interface TokenRecuperacaoSenhaRepository extends ExtendedSpringRepo<TokenRecuperacaoSenha, String>
{
@Query(value = "select rawtohex(sys_guid()) from dual", nativeQuery = true)
public String genereateToken();
}
When connected to Oracle, returns "8E0FFC48082AB39FE0539BD3E10AC537" While with H2, returns "00660032003300620037003000360065002d0031006400630066002d0034003700620030002d0039003400360066002d006100620065003400320034006400360030006300360038"
我猜使用的函数存在一些转换问题。
解决方案
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)
推荐阅读
- mysql - 在选定的日期获取可用房间 django
- python - 如何将参数从 subprocess.popen 传递到 powershell 脚本?
- freemarker - 如何在本地运行 try.freemarker.apache.org
- java - 在数组列表中显示偶数和奇数时出现问题
- rust - 我的 T 泛型确实实现了 where 的条件,但我不能使用它
- angular - 当我在请求中“返回”时,“无效”类型上不存在属性“订阅”
- python - 使用来自另一个字典的子集数据创建新字典
- gsm - AT 协议 - 呼叫应答或拒绝
- spring - Spring boot - 多对多关联不删除连接表数据
- android - 根据用户选择更改 API URL