我想选择具有在给定数组中具有名称的组或具有空组的User
。
这是我尝试的查询:
@Query("SELECT u FROM User u WHERE (u.group is null OR u.group.name IN :groups)")
Optional<Page<User>> findUsersByKeywordAndGroupIncludingNullGroup(Pageable pageable, @Param("groups") String... groups);
但是当我运行时,我在SQL语法中有错误。
因此,有没有正确的方法来做到这一点?
提前谢谢。
答案 0 :(得分:0)
您的查询有问题 如果您将传递(空或空)组,则生成的查询将变为
select * from users where users.group is null or users.group in ()
因此导致Syntax Error near '('
您可以使用 sPEL
进行黑客攻击@Query("SELECT U FROM User U " +
"WHERE U.group IS NULL " +
"OR (1=:#{ #groups == null || #groups.size() == 0 ? 1 : 0} OR U.group.name IN :#{#groups})")
List findUserWithoutGroupOrInGroup(@Param("groups") List<String> groups);
在这里,我使用了代理条件
1=:#{ #groups == null || #groups.size() == 0 ? 1 : 0}
此条件的第二部分returns 1
如果参数 groups为null或为空,则导致条件1 = 1为TRUE,从而跳过U.group.name IN :#{#groups}
此方法不是推荐方法,也不具备可扩展性。
在我看来,您应该分别获取Users without any Group
和Users in given group
。您甚至可以并行触发查询,并且如果组为空,则控制不要触发Users in given group
。