Spring JPA @Query验证错误:期望'(',<表达式>,函数或标识符,实际得到'('
Spring JPA @Query 校验错误
'(', <expression>, FUNCTION or identifier expected, got '(' 问题分析 核心原因
- 字符串拼接丢失空格
你写的JPQL通过多个字符串片段拼接生成,如果FROM BoardroomEntity boardroom片段末尾没有预留空格,和后续WHERE片段拼接后会变成boardroomWHERE(,不符合语法规则,IDE解析时就会抛出该错误。 - IDE JPA校验识别异常
如果IntelliJ没有正确配置JPA Facet,无法扫描识别到你的BoardroomEntity、BoardroomAttendeeEntity等实体类,会出现语法误判的情况。 - JPQL语法解析歧义
你写的CASE表达式和子查询拼接后,部分低版本的Hibernate JPQL解析器可能无法正确识别结构,产生语法误判。
解决方案
- 优先修正字符串拼接的空格问题,推荐使用Java 15+支持的文本块写法,从根源避免拼接空格遗漏:
@Query(value = """ SELECT boardroom FROM BoardroomEntity boardroom WHERE ( SELECT COUNT(1) + CASE WHEN boardroom.groupLeaderId IN ?1 THEN 1 ELSE 0 END FROM BoardroomAttendeeEntity boardroomAttendee WHERE boardroomAttendee.boardroom.id = boardroom.id AND boardroomAttendee.attendee.id IN ?1 ) > 1 """) List<BoardroomEntity> findByProfileIdAndAttendeeId(List<Long> attendeesIds);
- 显式给
CASE表达式加上括号,消除解析歧义:
COUNT(1) + (CASE WHEN boardroom.groupLeaderId IN ?1 THEN 1 ELSE 0 END)
- 确认项目配置了正确的JPA Facet:在IntelliJ中打开项目结构(File > Project Structure),在Modules中找到你的项目,添加JPA Facet,配置正确的持久化单元,指向你的实体类所在包,让IDE可以正确识别实体和JPQL语法。
- 如果项目启动、运行查询都正常,仅IDE报错的话,属于IDE校验误报,可以忽略或者在设置中关闭JPQL语法校验。
内容的提问来源于stack exchange,提问作者Emmanuel
相关产品推荐
相关产品推荐

