【问题标题】:Identifying if empty list parameter was passed to parameterized @NamedNativeQuery in Spring Boot识别是否将空列表参数传递给 Spring Boot 中的参数化 @NamedNativeQuery
【发布时间】:2018-11-19 11:23:23
【问题描述】:

我有 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

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

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

【问题讨论】:

  • 如何检查参数是否以前存在以及是否调用不同的查询?
  • @NiVeR 我也想过。但是,我在这篇文章中简化了我的查询。事实上,我有三个 'LEFT JOIN':user_privilege、user_competition、user_hobby。所以,我不认为我应该写 8 个不同的查询:D
  • 试试 Spring 数据规范!

标签: spring named-query nativequery hibernate-query


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-08
    • 1970-01-01
    • 2018-04-15
    • 2018-05-27
    • 2015-11-26
    • 1970-01-01
    相关资源
    最近更新 更多