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
相关产品推荐
相关产品推荐

