使用Hibernate在Oracle存储uuid2时的JPA查询异常问题
异常原因分析
核心问题:UUID类型映射不兼容
你遇到的问题本质是Hibernate(JPA的常用实现)对java.util.UUID类型的默认处理逻辑,与Oracle数据库的VARCHAR2字段类型不匹配,具体表现为:
保存阶段的转换逻辑
当你使用java.util.UUID作为实体字段时,Hibernate默认会将其按二进制类型(对应Oracle的RAW(16))处理:- 生成的带横杠UUID字符串(如
61adf93b-b76d-4b38-a43a-ffc033ad4cea)会被先转成16字节的二进制数据,再将二进制数据转成无横杠的大写十六进制字符串(如61ADF93BB76D4B38A43AFFC033AD4CEA)存入VARCHAR2字段。
- 生成的带横杠UUID字符串(如
查询阶段的解析逻辑
查询时,Hibernate依然按照二进制UUID的逻辑解析VARCHAR2字段的内容:- 它会把字段中的每个字符(比如
6、1、A等)的ASCII码值转成十六进制,再拼接成UUID格式,这就得到了你看到的错误值36314144-4639-3342-4237-364434423338(比如字符6的ASCII是54,对应十六进制36;字符1的ASCII是49,对应十六进制31,以此类推)。 - 而原生SQL查询直接读取字符串内容,没有经过Hibernate的类型转换,所以能得到正确结果。
- 它会把字段中的每个字符(比如
内容的提问来源于stack exchange,提问作者Daptal Ms
相关产品推荐
相关产品推荐

