SpringBoot中使用JPQL查询无法从PostgreSQL获取数据求助
问题排查与修复方案
1. 修复原生查询的参数绑定语法错误
你的@Query注解里的参数绑定存在空格问题,: category中冒号和参数名之间的空格会导致JPA无法正确识别参数,这是查询返回空的直接原因。修改后的查询语句如下:
@Query(value= "select * from questions q Where q.category = :category ORDER BY RANDOM() LIMIT :nOfQues", nativeQuery= true) List<Questions> findByCategoryANOfQuestions(String category, int nOfQues);
2. 验证数据库数据存在性
直接在PostgreSQL客户端执行以下SQL,替换'你的测试分类'为调用接口时传入的category值,确认数据库中是否存在对应数据:
SELECT * FROM questions WHERE category = '你的测试分类' LIMIT 5;
如果查询结果为空,说明数据库本身没有对应分类的数据,需要先插入测试数据。
3. 检查实体类与数据库表的映射一致性
确认Questions实体类的配置:
- 表名是否正确:实体类是否通过
@Table(name = "questions")指定了正确的表名(PostgreSQL表名默认小写,若实体类未指定可能导致映射错误)。 - 字段映射:
category字段是否通过@Column(name = "category")与数据库表的字段匹配,注意大小写和字段名是否完全一致。
4. 开启SQL日志排查实际执行语句
在application.properties中添加以下配置,查看JPA实际执行的SQL语句和参数:
spring.jpa.show-sql=true spring.jpa.properties.hibernate.format_sql=true
启动项目后调用接口,观察控制台输出的SQL,确认参数是否正确传入,查询条件是否符合预期。
5. 适配低版本Spring的参数绑定(可选)
如果你的Spring Boot版本低于2.0,需要在方法参数上添加@Param注解明确参数名:
@Query(value= "select * from questions q Where q.category = :category ORDER BY RANDOM() LIMIT :nOfQues", nativeQuery= true) List<Questions> findByCategoryANOfQuestions(@Param("category") String category, @Param("nOfQues") int nOfQues);
内容的提问来源于stack exchange,提问作者Jay
相关产品推荐
相关产品推荐

