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

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解析器可能无法正确识别结构,产生语法误判。

解决方案

  1. 优先修正字符串拼接的空格问题,推荐使用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);
  1. 显式给CASE表达式加上括号,消除解析歧义:
COUNT(1) + (CASE WHEN boardroom.groupLeaderId IN ?1 THEN 1 ELSE 0 END)
  1. 确认项目配置了正确的JPA Facet:在IntelliJ中打开项目结构(File > Project Structure),在Modules中找到你的项目,添加JPA Facet,配置正确的持久化单元,指向你的实体类所在包,让IDE可以正确识别实体和JPQL语法。
  2. 如果项目启动、运行查询都正常,仅IDE报错的话,属于IDE校验误报,可以忽略或者在设置中关闭JPQL语法校验。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 01:54:01