我对在JPA查询中使用IN子句有一个问题.当O使用c.id IN (1,7)时,它工作得很好,但当我使用c.id IN :categories时,它会给我这个错误:

Org.hibernate.type.descriptor.java.CoercionException:无法强制值[1,7][java.util.Array$ArrayList]

@Query("SELECT new com.example.events.dto.Event.ParticipantGetAllEventsDto(e, COUNT(p)) "
    + "FROM Event e JOIN FETCH e.reservation r JOIN FETCH r.salon s "
    + "LEFT JOIN r.participants p "
    + "JOIN e.categories c "
    + "WHERE (:title is null OR e.title LIKE %:title%) AND "
    + "(:isFree is null OR ((:isFree = true AND e.cost = 0) OR (:isFree = false AND e.cost >0 ))) AND "
    + "(:categories is null OR c.id IN (:categories) ) "
    + "GROUP BY e")
List<ParticipantGetAllEventsDto> getAll(@Param("title") String   title,@Param("categories") List<Long> categories ,@Param("isFree") boolean isFree);

我也查了一下categories的S的值:它是一个arrayList,值是[1,7]

推荐答案

我已经复制了您的设置,并收到了相同的错误.如果myParameter是集合,则JPQL似乎无法处理支票:myParameter IS NULL.如果取消对NULL的判断,则查询可以正常工作.

当然,这不是您想要的--根据参数打开/关闭IN子句.

Workaround 1

引入一个单独的布尔参数,如下所示:

    @Query("SELECT c FROM Customer c WHERE (:noList = true OR c.id IN (:theList))")
    List<Customer> findFromList(List<Long> theList, boolean noList);

Workaround 2

请改用条件查询.

Java相关问答推荐

在Spring Boot中测试时出现SQL语法错误

我们如何直接使用kerminldap服务票证来通过ldap进行身份验证并形成LDAP上下文

虚拟线程似乎在外部服务调用时阻止运营商线程

Springdoc Whitelabel Error Page with Spring V3

路径映射未发生

使用动态ID从json获取详细信息的Jolt规范

如何确定springboot在将json字段转换为Dto时如何处理它?

通过Spring Security公开Spring Boot执行器端点

用OSQL创建索引

如何在不删除Java中已有内容的情况下覆盖文件内容?

try 从REST API返回对象列表时出错

使用正则表达式从字符串中提取多个值

为什么Collectors.toList()不能保证易变性

在settings.gradle.kts和Build.gradle.kts中使用公共变量

Java.lang.invke.LambdaConversionException:实例方法InvokeVirtual的参数数量不正确

EXCEL中的公式单元格显示#NAME?

如何在Java中使用正则表达式拆分字符串

控制器建议异常处理

spring 数据Elastic search 与 spring 启动数据Elastic search 之间的区别是什么?

简化每个元素本身都是 map 列表的列表