2017-05-14 67 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