如何在JPA原生查询中将UUID绑定为VARCHAR类型参数?
解决Oracle中JPA原生查询UUID参数绑定为Binary的问题
方案一:将参数类型改为String列表
因为数据库中UUID列是VARCHAR(36)类型,直接传入字符串格式的UUID可以让JPA自动绑定为VARCHAR类型,匹配数据库列类型。
修改Repository方法的参数类型:
@Query( """ SELECT t.id, t.uuid, ... FROM my_table t START WITH t.uuid in (:uuids) CONNECT BY PRIOR t.parent_id = t.id """, nativeQuery = true ) fun getMyEntitiesByUuids(uuids: List<String>): List<MyEntity>
调用该方法时,将UUID对象转换为字符串:
val uuidList: List<UUID> = // 你的UUID列表 val stringUuids = uuidList.map { it.toString() } val entities = repository.getMyEntitiesByUuids(stringUuids)
方案二:自定义参数转换器
通过Spring Data的Converter将UUID自动转换为字符串类型绑定到SQL,无需修改调用逻辑:
- 实现转换类:
@Component class UuidToStringConverter : Converter<UUID, String> { override fun convert(source: UUID): String { return source.toString() } }
- 在Repository方法参数上添加转换注解:
@Query( """ SELECT t.id, t.uuid, ... FROM my_table t START WITH t.uuid in (:uuids) CONNECT BY PRIOR t.parent_id = t.id """, nativeQuery = true ) fun getMyEntitiesByUuids(@Convert(converter = UuidToStringConverter::class) uuids: List<UUID>): List<MyEntity>
方案三:SQL中显式转换参数类型
如果不想修改参数或添加转换器,可以在原生SQL中将二进制参数转换为带分隔符的字符串格式,适配Oracle的函数处理:
@Query( """ SELECT t.id, t.uuid, ... FROM my_table t START WITH t.uuid in ( SELECT REGEXP_REPLACE(RAWTOHEX(u), '([0-9A-F]{8})([0-9A-F]{4})([0-9A-F]{4})([0-9A-F]{4})([0-9A-F]{12})', '\1-\2-\3-\4-\5') FROM TABLE(CAST(:uuids AS SYS.ODCIVARCHAR2LIST)) u ) CONNECT BY PRIOR t.parent_id = t.id """, nativeQuery = true ) fun getMyEntitiesByUuids(uuids: List<UUID>): List<MyEntity>
注:该方式逻辑较复杂,仅推荐在无法修改参数或转换器的场景使用。
内容的提问来源于stack exchange,提问作者GeumLiAh
相关产品推荐
相关产品推荐

