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

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,但目前该类型的解析逻辑尚未实现。

可行的解决方案

  1. 改用关联子查询改写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);
    
  2. 传入实体ID集合替代实体集合
    利用Spring Data JPA的查询方法自动生成能力,直接通过实体ID进行IN查询,无需自定义JPQL:

    List<Vet> findBySpecialtiesIdIn(Collection<Long> specialtyIds);
    

内容的提问来源于stack exchange,提问作者Georgii Vlasov

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 19:57:52