具有二进制 UUID/二进制参数的休眠会话过滤器失败

Posted

技术标签:

【中文标题】具有二进制 UUID/二进制参数的休眠会话过滤器失败【英文标题】:Hibernate session filter with binary UUID/binary param fails 【发布时间】:2022-01-12 02:54:30 【问题描述】:

我正在尝试对包含 UUID 的二进制 (16) 表示的表的查询应用过滤器,但是我收到错误:

java.lang.IllegalArgumentException: Incorrect filter parameter [accountId]
    at org.hibernate.internal.FilterImpl.setParameter(FilterImpl.java:80) ~[hibernate-core-5.4.32.Final.jar:5.4.32.Final]

我已经尝试过这两个过滤器声明

@FilterDef(name="accountFilter", parameters=@ParamDef( name="accountId", type="binary" ) )
@Filter(name="accountFilter", condition=":accountId = account_id")

@FilterDef(name="accountFilter", parameters=@ParamDef( name="accountId", type="binary" ) )
@Filter(name="accountFilter", condition="UUID_TO_BIN(:accountId) = account_id")

使用 UUID toString 方法调用过滤器:

enableFilter(ACCOUNT_FILTER, "accountId", currentUser.getAccount().getId().toString());

两者都会导致相同的错误。

使用 mysql 8.0.23 和 Hibernate 5.4.32。该列定义为二进制(16)数据

【问题讨论】:

【参考方案1】:

我的 WHERE 子句 UUID 函数失败了。它应该是这样的:

@FilterDef(name="accountFilter", parameters=@ParamDef( name="accountId", type="string" ) )
@Filter(name="accountFilter", condition=":accountId = UUID_TO_BIN(account_id)")

将字符串作为过滤器参数传递。

【讨论】:

以上是关于具有二进制 UUID/二进制参数的休眠会话过滤器失败的主要内容,如果未能解决你的问题,请参考以下文章

JS小数运算失精度的问题

视图中的休眠打开会话:每个请求的事务?

具有后台工作人员的 Web 应用程序的休眠会话管理策略?

模型量化原理及tflite示例

使用 Laravel 关系 orm 时 UUID 二进制(16)的问题

grails 使用 uuid 作为 id 并映射到二进制列