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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 01:39:18