在Spring Data JPA中,如果@Query中的List参数为null,则可以跳过该参数:antlr.NoViableAltException: unexpected AST node

5

更新

    @Query(value = "select distinct d.documentId " +
        "from TrainingDocument d " +
        "where (:docTypes is null or d.documentTypeName in :docTypes)")
List<String> findDocByDocTypes(
        @Param("docTypes") List<String> docTypes);

我有一个类似上面的查询,其中我检查List<String> docTypes是否为null。当docTypes == null或列表中只有一个元素时,它可以工作。一旦我有多个元素,我就会得到以下错误:

org.hibernate.hql.internal.ast.QuerySyntaxException: unexpected AST node: {vector} 
[select distinct d.documentId from com.example.model.TrainingDocument d 
where (:docTypes_0_, :docTypes_1_ is null or d.documentTypeName in
(:docTypes_0_, :docTypes_1_))]; nested exception is
java.lang.IllegalArgumentException:
org.hibernate.hql.internal.ast.QuerySyntaxException: unexpected AST node: {vector} 
[select distinct d.documentId from com.example.model.TrainingDocument d
where (:docTypes_0_, :docTypes_1_ is null or d.documentTypeName in
(:docTypes_0_, :docTypes_1_))]

我已经找到了这个解决方案How to skip @Param in @Query if is null or empty in Spring Data JPA 它描述了我的情况,但对我不起作用。 我正在使用spring-boot 1.5.9.RELEASE


JPQL看起来很好,我认为问题要么是Spring没有正确地将JPQL传递给您的JPA提供程序,要么是您的JPA提供程序没有正确地将JPQL转换为SQL(:docTypes_0_, :docTypes_1_ is null是无效的)。使用JPA提供程序的日志来确定哪一个,并向相关人员报告错误。 - user8558216
抱歉,我发现你提到的各种变化非常令人困惑。你能否:1. 简化代码,删除与问题无关的所有内容。可能是一个带有一个参数的方法,其中包含一个in子句和空值检查。2. 对于每个变体,展示代码,包括如何调用它以及结果是什么(执行的查询+堆栈跟踪)。 - Jens Schauder
我简化了这个例子,希望能更好地理解。似乎如果我添加了这个空值检查,并且列表大于一个元素,它就停止工作了。 - Elina Zarisheva
1个回答

1
如果您的向量为空,可以返回 null,否则可以返回第一个值。
where (coalesce(:docTypes, null) is null or d.documentTypeName in :docTypes)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接