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

Spring Boot JPA @Query注解使用报错排查求助

问题原因分析

1. @Query默认解析JPQL而非原生SQL

Spring Data JPA的@Query注解默认使用JPQL(Java持久化查询语言),它是面向你定义的实体类的查询语言,操作的是实体对象(比如你的Sudoku类),不是数据库里的物理表。你之前写的SELECT * FROM sudoku,JPQL会把sudoku当作实体类名查找,但你的实体类是首字母大写的Sudoku,自然匹配失败报错。而数据库里的表名是小写sudoku,所以直接在数据库执行能成功,但JPQL不识别这种物理表名。

2. JPA的实体-表映射规则

JPA默认会按照命名策略(比如Spring Boot默认的SpringPhysicalNamingStrategy)把实体类名(如Sudoku)映射为数据库表名(如小写的sudoku)。这就导致了:数据库里用sudoku表能查,JPQL里却必须用实体类名Sudoku才能正确关联到对应的表。

而findAllByOrderByIdAsc()这种方法名查询,Spring Data JPA会自动帮你转换成符合规则的JPQL,它能正确识别实体类和属性,所以可以正常运行。

补充:如果想使用原生SQL

要是你确实需要在@Query里写原生SQL,只需要加上nativeQuery = true参数即可,示例代码:

@Query(value = "SELECT * FROM sudoku", nativeQuery = true)
List<Sudoku> findAllSudokus();

加上这个参数后,JPA会把这段查询直接当作原生SQL发送给数据库执行,这时就可以用数据库的物理表名sudoku了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 06:44:52