You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Ignite Spring Data JPA中IN语法使用报错,求解决方案及用法确认

解决Ignite Spring Data + H2中IN查询的SQL语法错误问题

我之前也踩过类似的坑,结合你给出的环境版本和问题细节,帮你梳理下问题原因和解决办法:

问题原因确认

你用的环境组合:

  • Ignite: 2.7.6
  • Ignite Spring Data: 2.0
  • Spring Boot: 2.0.9.RELEASE
  • H2: 1.4.197

这个问题不是你对IN表达式的使用有误,而是Ignite Spring Data 2.0版本的一个兼容性bug:它自动生成的IN查询SQL多套了一层冗余括号,也就是你看到的(("BerthplanShipVisit"."shipVisitId" IN ?)),H2的SQL解析器对这种多余的括号处理严格,所以抛出了语法错误。而范围查询(比如GreaterThanEqual)的SQL生成逻辑没有这个问题,所以能正常运行。

可行的解决办法

1. 升级Ignite Spring Data版本

这个bug在Ignite Spring Data的后续版本(比如2.1及以上,尤其是和Ignite主版本对齐的2.7.x版本)已经被修复了。你可以把ignite-spring-data_2.0的版本升级到和Ignite 2.7.6匹配的稳定版,修改你的依赖配置(以Maven为例):

<dependency>
    <groupId>org.apache.ignite</groupId>
    <artifactId>ignite-spring-data_2.0</artifactId>
    <version>2.7.6</version>
</dependency>

升级后框架会生成正确的SQL,不需要额外修改代码。

2. 自定义SQL查询绕过bug

如果暂时没办法升级依赖,可以在Repository接口中手动定义查询语句,替代自动生成的有问题的SQL:

public interface BerthplanShipVisitRepository extends IgniteRepository<BerthplanShipVisit, Long> {
    // 自定义IN查询,避免框架生成错误的SQL
    @Query("SELECT * FROM BerthplanShipVisit WHERE shipVisitId IN ?")
    List<BerthplanShipVisit> findByShipVisitIdIn(List<Long> shipVisitIds);
}

这里直接用Ignite支持的SQL语法编写,参数会被正确绑定,不会出现冗余括号的问题。

关于IN表达式使用的验证

你对findByShipVisitIdIn(或findByShipVisitIdIsIn)的用法是完全符合Spring Data命名规范的,参数传入Collection、数组都可以,这个部分没有问题,不用怀疑自己的写法。

内容的提问来源于stack exchange,提问作者张耀文

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 09:16:38