@Query关联查询时出现Java报错:annotation values must be of the form 'name=value'
问题原因及解决方法
错误根源
你遇到的java: annotation values must be of the form 'name=value'本质是SQL语法错误导致注解解析异常,具体问题有三点:
- 子查询未指定别名:SQL中用子查询作为JOIN的关联表时,必须给子查询分配别名,否则数据库无法识别这个临时表。
- JOIN关联条件写法错误:你把关联条件写在了子查询的WHERE里,不符合JOIN的标准语法,会导致逻辑混乱。
- 查询字段范围不当:
SELECT *会同时返回两张表的字段,无法正确映射到ConnectionRequest对象。
修正后的代码
@Query("SELECT c.* FROM ConnectionRequest c " + "INNER JOIN (SELECT id, firstName as name FROM USER u) u_sub " + "ON c.userId = u_sub.id " + "WHERE c.dateTimeCompleted IS NULL", nativeQuery = true) List<ConnectionRequest> findAllByDateTimeCompletedIsNull();
关键修改点
- 给子查询添加别名
u_sub,满足SQL语法要求。 - 将关联条件
c.userId = u.id移到ON子句中,这是JOIN的标准写法,逻辑更清晰。 - 把
SELECT *改为SELECT c.*,只查询ConnectionRequest表的字段,确保能正确映射到实体类。 - 子查询中显式包含
id字段,保证能和ConnectionRequest的userId关联。
内容的提问来源于stack exchange,提问作者HelpTheNoob
相关产品推荐
相关产品推荐

