首页 > 解决方案 > 识别是否将空列表参数传递给 Spring Boot 中的参数化 @NamedNativeQuery

问题描述

我有 3 个表userprivilegeuser_privilege。最后一个表存储user_idprivilege_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.

现在,问题是:我必须如何检查列表是否为空,以便我可以检索所有用户,即使他们有或没有权限;同时,如果参数不为空 - 检索具有列表参数中指定权限的用户。

如果您有解决类似问题的经验,请帮助我。提前致谢!

标签: springnamed-querynativequeryhibernate-query

解决方案


我找到了解决我的问题的方法。在客户端(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确定此列表是否为空并检索所有用户,无论他们是否具有特权。


推荐阅读