Hibernate使用binary UUID参数配置session filter报错如何解决
问题根因
你在@ParamDef中将accountId的类型声明为binary,但实际传参时传入的是UUID的字符串格式值,Hibernate无法将字符串类型的值匹配到声明的binary类型参数,因此抛出参数不合法异常。
解决方案
提供两种可直接落地的修改方案,按需选择即可:
方案一:保持参数类型为binary,调整传参逻辑
直接传递转换为16字节数组的UUID值,无需在SQL层做转换,性能更好。
- 新增UUID转16字节数组的工具方法:
public static byte[] uuidToBytes(UUID uuid) { ByteBuffer buffer = ByteBuffer.wrap(new byte[16]); buffer.putLong(uuid.getMostSignificantBits()); buffer.putLong(uuid.getLeastSignificantBits()); return buffer.array(); }
- 修改filter传参逻辑:
enableFilter(ACCOUNT_FILTER, "accountId", uuidToBytes(currentUser.getAccount().getId()));
- Filter配置保持第一种写法即可:
@FilterDef(name="accountFilter", parameters=@ParamDef( name="accountId", type="binary" ) ) @Filter(name="accountFilter", condition=":accountId = account_id")
方案二:保持传参逻辑不变,调整Filter配置
将参数类型声明为字符串,在SQL层通过MySQL内置函数做转换,无需修改上层传参代码。
- 修改Filter配置如下:
@FilterDef(name="accountFilter", parameters=@ParamDef( name="accountId", type="string" ) ) @Filter(name="accountFilter", condition="UUID_TO_BIN(:accountId) = account_id")
- 原有传参逻辑无需调整,继续传UUID的字符串值即可。
注意事项
如果你存储UUID时使用了UUID_TO_BIN(xxx, 1)交换了字节顺序来优化索引性能,需要对应调整转换逻辑:
- 方案一的工具方法中需要调整ByteBuffer的字节顺序为小端,或者按swap规则重新拼接字节
- 方案二的condition中需要改成
UUID_TO_BIN(:accountId, 1) = account_id
内容的提问来源于stack exchange,提问作者Half_Duplex
相关产品推荐
相关产品推荐

