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

手动SQL可正常返回结果,但Spring Boot Hibernate原生查询返回0条数据的问题排查

手动SQL可正常返回结果,但Spring Boot Hibernate原生查询返回0条数据的问题排查

从你的描述来看,手动执行SQL能拿到1条结果,但通过Hibernate原生查询却返回0条,而且控制台打印的Hibernate SQL和你手动执行的看起来完全一致,这确实有点棘手。我来帮你梳理几个最可能的排查方向,按优先级来:

1. 先确认数据源一致性——最容易忽略的坑

你手动在Workbench/控制台跑SQL的数据库,和Spring Boot应用连接的是同一个数据库吗?

  • 打开你的Spring Boot配置文件(application.properties或application.yml),检查spring.datasource.url、spring.datasource.username、spring.datasource.password这三个配置,确保和你手动连接的数据库完全一致(比如IP、端口、库名,甚至是否是本地/测试环境)。
  • 可以在Spring Boot代码里临时加一个查询,验证目标数据是否存在:
    @Query(value = "select count(*) from meals where user_id=0 and date='2025-06-19'", nativeQuery = true)
    Long countMeals();
    
    调用这个方法看返回值,如果是0,那说明Spring Boot连接的数据库里没有这条数据,这就是问题根源!

2. 检查查询语句中的字段名差异

我注意到你在@Query里写的是meal_food.servings_consumed,但你给出的meal_food表结构里的字段是servings,而控制台打印的Hibernate SQL里却是meal_food.servings——这里是不是有代码修改的误差?

  • 如果Hibernate实际执行的SQL用了不存在的字段名(比如servings_consumed),MySQL会返回NULL值,但一般不会导致返回0条结果;不过还是要确保查询语句的字段名和数据库表结构完全一致,避免后续映射或潜在的执行问题。

3. 验证结果集到MealGui的映射是否正常

虽然映射问题通常不会导致返回0条(最多是返回的对象字段为NULL),但还是要确认Hibernate能正确把查询结果映射到MealGui:

  • 建议修改原生查询,给每个字段显式指定别名,和MealGui的属性名完全对应(即使MySQL不区分大小写,显式别名能避免任何潜在的大小写或字段匹配问题):
    @Query(value = "select " +
            "myfood.fdc_id as fdc_id, " +
            "myfood.user_id as user_id, " +
            "myfood.brand as brand, " +
            "myfood.category as category, " +
            "meals.date as date, " +
            "meals.meal as meal, " +
            "meal_food.servings as servings " +
            "from myfood " +
            "left join meal_food on myfood.fdc_id = meal_food.myfood_id " +
            "left join meals on meal_food.meal_id = meals.id " +
            "where myfood.user_id =0 and meals.user_id = 0 and meals.date = '2025-06-19'", 
            nativeQuery = true)
    List<MealGui> findMyFood();
    
  • 同时确保MealGui的无参构造函数、getter/setter都正常(你已经加了@NoArgsConstructor、@Getter、@Setter,这部分没问题)。

4. 开启Hibernate详细日志,看执行细节

如果上面的方法都没找到问题,建议开启Hibernate的SQL详细日志,看实际执行时的所有细节:

  • 在application.properties里添加:
    logging.level.org.hibernate.SQL=DEBUG
    logging.level.org.hibernate.type.descriptor.sql.BasicBinder=TRACE
    
    这样会打印出Hibernate发送给数据库的完整SQL语句以及执行细节,能帮你确认SQL是否和手动的完全一致,甚至能看到数据库返回的结果集行数,定位是Hibernate没拿到结果,还是映射时丢失了。

5. 排查数据库事务或数据状态

如果你手动插入的测试数据没有提交(比如Workbench里开启了事务但没执行commit;),而Spring Boot的数据库连接是新的,就看不到这条数据。不过你说手动执行SQL能拿到结果,说明数据已经提交了,这个可能性较低,但可以在Workbench里再次执行select * from meals where user_id=0 and date='2025-06-19';确认数据确实存在。

按照上面的步骤一步步排查,应该能很快找到问题所在,最可能的就是数据源不一致的问题,先重点检查这个!

内容来源于stack exchange

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.08 10:25:29