Spring JPA Repository查询返回0行空结果问题排查
问题核心原因
你的查询返回空结果,根因是JPA配置里的spring.jpa.hibernate.ddl-auto设成了create-drop:
- 这个配置的逻辑是:每次应用启动时自动删除所有旧表,根据实体类重新建空表;应用停止时再把所有表删掉。你之前存入Shift表的所有数据,会在每次应用重启后被清空,查询自然拿不到任何记录。
修复方案
1. 先修正ddl-auto配置
根据你的运行场景替换掉create-drop:
- 开发阶段如果想让Hibernate自动同步表结构,用
update - 生产环境直接用
validate或者none,禁止Hibernate自动改表结构,避免误删数据
修正后的配置参考:
spring: jpa: properties: hibernate.default_schema: dev_env hibernate: ddl-auto: update database-platform: org.hibernate.dialect.PostgreSQLDialect show-sql: true # 临时打开SQL日志,方便排查问题 datasource: hikari: schema: dev_env driverClassName: org.postgresql.Driver # 删掉原来的type配置,Spring Boot默认已经集成HikariCP,指定tomcat数据源反而可能引发初始化异常
2. 简化冗余代码
你继承的CrudRepository已经内置了findAll()方法,效果和你自定义的JPQLSELECT s FROM Shift s完全一致,不需要额外写查询方法,直接用内置方法即可:
// Repository层 public interface ShiftRepository extends CrudRepository<Shift, Long> { // 无需自定义getAllShifts方法 }
// Service层 public List<Shift> getAllShifts() { return shiftRepository.findAll(); }
3. 验证数据
改完配置重启应用后,先直接连Heroku Postgres执行SQL确认表内有数据:
SELECT count(*) FROM dev_env.shift;
确认有数据之后再调用接口,如果还是返回空,看控制台打印的Hibernate执行SQL,核对查询的表名、schema是不是和你实际存数据的表一致,重点检查Shift实体类的@Table注解有没有正确指定schema和表名,避免实体映射到了错误的空表。
内容的提问来源于stack exchange,提问作者Pale Horse
相关产品推荐
相关产品推荐

