Spring Data JPA实体集合能否传入IN/NOT IN?实践遇异常
Spring Data JPA传入实体集合到IN子句触发Hibernate未实现异常问题
根据Spring Data JPA文档说明,实体集合可以传入IN或NOT IN子句中使用,但实际测试时触发了Hibernate异常,以下是复现细节:
复现代码
Repository接口定义
在VetRepository中定义了如下查询方法:
@Query("select v from Vet v where v.specialties in ?1") List<Vet> findBySpecialtiesIn(Collection<Specialty> specialties);
异常信息
调用该方法时触发以下异常:
java.lang.IllegalStateException: Failed to execute CommandLineRunner Caused by: org.hibernate.NotYetImplementedFor6Exception: org.hibernate.query.sqm.sql.internal.PluralValuedSimplePathInterpretation
问题原因与解决方案
这不是文档的误导性错误,而是Hibernate 6.x版本的JPQL解析逻辑变更导致的:
- Hibernate 6对JPQL的解析做了重构,当你直接写
v.specialties in ?1时,v.specialties是一个集合属性,Hibernate会将其解析为PluralValuedSimplePath,但目前该类型的解析逻辑尚未实现。
可行的解决方案
改用关联子查询改写JPQL
调整查询语句为存在性检查,绕过集合属性直接IN的问题:@Query("select v from Vet v where exists (select s from v.specialties s where s in ?1)") List<Vet> findBySpecialtiesIn(Collection<Specialty> specialties);传入实体ID集合替代实体集合
利用Spring Data JPA的查询方法自动生成能力,直接通过实体ID进行IN查询,无需自定义JPQL:List<Vet> findBySpecialtiesIdIn(Collection<Long> specialtyIds);
内容的提问来源于stack exchange,提问作者Georgii Vlasov
相关产品推荐
相关产品推荐

