Spring Boot执行Native Query返回结果与直接执行SQL结果不一致问题
问题原因及解决方案
你遇到的原生查询和直接执行SQL返回结果不一致的问题,基本都是Spring Data JPA的自动机制或者配置问题导致,可按以下步骤排查解决:
核心常见原因(90%以上的概率是这个)
Spring Data JPA 对方法名带有First、Top关键字的查询方法,会默认自动在生成的SQL末尾追加LIMIT 1,这个规则对原生查询同样生效。
- 检查你的
find*****()方法名,是否为findFirstXXX、findTopXXX这类格式,如果是直接修改方法名,移除First/Top关键字即可恢复正常。
其他排查路径
- 开启SQL执行日志,打印JPA实际执行的完整SQL,和你在SQL Navigator中运行的SQL做对比,确认是否被额外拼接了限制返回行数的逻辑:
在application配置文件中添加以下配置:
运行调用方法后查看控制台输出的SQL,若末尾多了# application.properties 配置 spring.jpa.show-sql=true spring.jpa.properties.hibernate.format_sql=true logging.level.org.hibernate.type.descriptor.sql.BasicBinder=TRACELIMIT 1即可定位到是JPA自动添加的限制,排查是否有全局配置、拦截器修改了查询的最大返回行数。 - 检查是否在调用该方法时,错误传入了分页参数(如Pageable对象的pageSize设为1),或者手动调用了
setMaxResults(1)方法。 - 排查结果映射问题:如果返回字段的类型映射异常,可能会导致重复值被自动过滤,可尝试将方法返回值修改为
List<Object[]>,验证返回条数是否符合预期,再排查String类型转换的问题。 - 若使用的Hibernate版本为5.4.x~5.6.x的早期版本,存在原生查询结果截断的已知bug,可升级到Hibernate稳定版验证。
内容的提问来源于stack exchange,提问作者Alec Jones
相关产品推荐
相关产品推荐

