手动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代码里临时加一个查询,验证目标数据是否存在:
调用这个方法看返回值,如果是0,那说明Spring Boot连接的数据库里没有这条数据,这就是问题根源!@Query(value = "select count(*) from meals where user_id=0 and date='2025-06-19'", nativeQuery = true) Long countMeals();
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里添加:
这样会打印出Hibernate发送给数据库的完整SQL语句以及执行细节,能帮你确认SQL是否和手动的完全一致,甚至能看到数据库返回的结果集行数,定位是Hibernate没拿到结果,还是映射时丢失了。logging.level.org.hibernate.SQL=DEBUG logging.level.org.hibernate.type.descriptor.sql.BasicBinder=TRACE
5. 排查数据库事务或数据状态
如果你手动插入的测试数据没有提交(比如Workbench里开启了事务但没执行commit;),而Spring Boot的数据库连接是新的,就看不到这条数据。不过你说手动执行SQL能拿到结果,说明数据已经提交了,这个可能性较低,但可以在Workbench里再次执行select * from meals where user_id=0 and date='2025-06-19';确认数据确实存在。
按照上面的步骤一步步排查,应该能很快找到问题所在,最可能的就是数据源不一致的问题,先重点检查这个!
内容来源于stack exchange
相关产品推荐
相关产品推荐

