在Hibernate查询语言

时间:2017-05-14 15:45:25

标签: spring spring-data-jpa jpql

我想选择具有在给定数组中具有名称的组或具有空组的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语法中有错误。 因此,有没有正确的方法来做到这一点? 提前谢谢。

1 个答案:

答案 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 GroupUsers in given group。您甚至可以并行触发查询,并且如果组为空,则控制不要触发Users in given group