spring - 识别是否将空列表参数传递给 Spring Boot 中的参数化 @NamedNativeQuery
问题描述
我有 3 个表user
:privilege
和user_privilege
。最后一个表存储user_id
和privilege_id
,即有关用户及其权限的信息。我想按权限过滤用户。为此,我将特权 ID 列表List<Integer> privilegeIDs
作为参数传递给以下查询:
@NamedNativeQuery(name = "User.filterUsersByPrivilges",
query = "SELECT u.username " +
"FROM user u " +
"LEFT JOIN user_privilege up ON u.id = up.user_id " +
"WHERE up.privilege_id IN ?1; ",
resultSetMapping = "userCatalog")
但是,在客户端(Angular 5),有时我可能会将此权限列表留空,以便检索所有用户,无论他们是否有权限。在这里我发现如果我将空列表参数传递给IN
条件,它会在服务器日志中给出错误。事实证明,当检查IN
条件时,参数不能为空。
我试图通过null
并检查,WHERE up.privilege_id IN ?1 OR ?1 IS NULL
但它仍然发誓你不能将空列表传递给IN
.
现在,问题是:我必须如何检查列表是否为空,以便我可以检索所有用户,即使他们有或没有权限;同时,如果参数不为空 - 检索具有列表参数中指定权限的用户。
如果您有解决类似问题的经验,请帮助我。提前致谢!
解决方案
我找到了解决我的问题的方法。在客户端(Angular 5),在发送我的权限列表之前,我检查它是否为空。如果列表中没有数据,我将按以下方式发送我的权限过滤器列表:[0]
。
同时,我正在像这样更改我的查询:
@NamedNativeQuery(name = "User.filterUsersByPrivilges",
query = "SELECT u.username " +
"FROM user u " +
"LEFT JOIN user_privilege up ON u.id = up.user_id " +
"WHERE up.privilege_id IN ?1 OR (0 IN ?1 AND 1=1); ",
resultSetMapping = "userCatalog")
我0 IN ?1 AND 1=1
确定此列表是否为空并检索所有用户,无论他们是否具有特权。
推荐阅读
- r - 如何在 ggplot cumsum plot 的 x 轴上显示刻度标签
- postgresql - 带有 Hikari 的 Spring JPA 未释放连接
- android - 当存在异常对象时解析 json 列表以及使用 Retrofit2
- javascript - while循环测试用例错误
- oracle - 如何解决 oracle apex 中的会话交换或会话过期问题
- sql-server - SSIS - EXCEL 目标变为空白
- nginx - 使用 Kuberenetes 入口控制器作为集群中其他服务的反向代理
- java - 从当前字母中查找字母表中的第 n 个字母
- php - 如何通过响应/批量 API 请求在 SurveryMonkey 中使用 CURL 下载图像资产?
- python - 处理多类分类问题中的不平衡数据