Spring Data JPA查询Set集合包含指定Driver对象报错求助
解决HQL查询集合
contains方法导致的antlr.NoViableAltException错误 这个问题我之前踩过坑!你在HQL里直接调用Java集合的contains()方法是行不通的——HQL的语法解析器根本不认识这个Java方法,所以才会抛出antlr的语法错误。下面给你几个靠谱的解决办法:
方法1:使用HQL的member of关键字
这是HQL专门用来判断实体是否属于关联集合的标准语法,完美匹配你的需求,修改后的查询方法如下:
@Query("select dev from Device dev where ?1 member of dev.authorizedDrivers") Set<Device> findDeviceByDriver(Driver driver);
member of就是HQL里对应Java集合contains()的等价写法,解析器能正确识别这个语法,不会再报错。
方法2:使用关联查询(Join)
如果后续需要扩展查询条件,用Join的方式会更灵活,通过关联Device和它的authorizedDrivers集合来筛选,记得加distinct避免重复结果:
@Query("select distinct dev from Device dev join dev.authorizedDrivers dr where dr = ?1") Set<Device> findDeviceByDriver(Driver driver);
方法3:用Spring Data JPA命名查询(更简洁)
其实你完全不用手写@Query,Spring Data JPA支持按照命名规则自动生成查询,直接定义方法名就能实现相同逻辑:
Set<Device> findByAuthorizedDriversContaining(Driver driver);
框架会自动帮你生成正确的HQL语句,省心又不容易出错。
额外提醒
不管用哪种方法,都要确保你的Driver实体正确实现了equals()和hashCode()方法——JPA判断实体是否匹配的时候,依赖这两个方法来做对象比较。
内容的提问来源于stack exchange,提问作者Nunyet Calçada
相关产品推荐
相关产品推荐

