Определение, был ли передан параметризованный пустой список параметризованному @NamedNativeQuery в Spring Boot - PullRequest
0 голосов
/ 09 июня 2018

У меня есть 3 таблицы: user, privilege и user_privilege.В последней таблице хранятся user_id и privilege_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.

Теперь возникает вопрос: как я должен проверить, пуст ли список, чтобы я мог получить всех пользователей, даже если они имеют или не имеют привилегий;в то же время, если параметр не пустой - извлеките тех пользователей, у которых есть права, указанные в параметре списка.

Если у вас есть опыт решения аналогичной проблемы, помогите мне, пожалуйста.Заранее спасибо!

1 Ответ

0 голосов
/ 11 июня 2018

Я нашел решение для моей проблемы.На стороне клиента (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 я идентифицирую, является ли этот список пустым, и извлекаю всех пользователей независимо от того, имеют ли они привилегии или нет.

...