【发布时间】:2018-11-19 11:23:23
【问题描述】:
我有 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。
现在,问题是:我必须如何检查列表是否为空,以便我可以检索所有用户,即使他们有或没有权限;同时,如果参数不为空 - 检索那些具有列表参数中指定权限的用户。
如果你有解决类似问题的经验,请帮助我。提前致谢!
【问题讨论】:
-
如何检查参数是否以前存在以及是否调用不同的查询?
-
@NiVeR 我也想过。但是,我在这篇文章中简化了我的查询。事实上,我有三个 'LEFT JOIN':user_privilege、user_competition、user_hobby。所以,我不认为我应该写 8 个不同的查询:D
-
试试 Spring 数据规范!
标签: spring named-query nativequery hibernate-query