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,提问作者张耀文
相关产品推荐
相关产品推荐

