2017-05-14 51 views
0

我想选择User s,该组具有给定数组中的名称或具有空组。 这是我的企图查询: @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语法错误。 因此,是否有正确的方法来做到这一点? 在此先感谢。在数组中选择或在Hibernate查询语言中选择null

+0

这是因为如果你不会传递任何'组'。生成的SQL查询将是'SELECT u FROM User u WHERE u.group is null or u.group.name IN()',这是无效的。 – ansh

+0

我明白了。有没有办法检查'groups'是否为空? –

回答

0

问题与您的查询
如果你将通过(null或空)组,然后将得到的查询将成为

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如果参数 组是空值或空白,结果在条件1 = 1为TRUE,并从而跳过的

第二部分U.group.name IN :#{#groups}

这种方法不是推荐的方法,也不可扩展。

在我看来,你应该分别取Users without any GroupUsers in given group。您甚至可以并行触发查询并控制如果组为空,则不会触发Users in given group