【问题标题】:Spring JPA/Hibernate returns random last page?Spring JPA/Hibernate 返回随机最后一页?
【发布时间】:2020-12-06 08:11:42
【问题描述】:

我最近从以下位置升级了一项服务:

  • JDK8 -> JDK11
  • Spring Boot 1.5 -> Spring Boot 2.3

从那时起,集成测试以一种奇怪的方式失败,例如在执行查询时(可分页)。从 100 个结果(即 5 页)中,第 5 页始终是随机选择。

结果如下所示:

第 0 页(ids [0, 19])

[SomeObject@... 'inttest_log_device_0', ...]
[SomeObject@... 'inttest_log_device_1', ...]
[SomeObject@... 'inttest_log_device_2', ...]
[SomeObject@... 'inttest_log_device_3', ...]
[SomeObject@... 'inttest_log_device_4', ...]
[SomeObject@... 'inttest_log_device_5', ...]
[SomeObject@... 'inttest_log_device_6', ...]
[SomeObject@... 'inttest_log_device_7', ...]
[SomeObject@... 'inttest_log_device_8', ...]
[SomeObject@... 'inttest_log_device_9',...]
[SomeObject@... 'inttest_log_device_10', ...]
[SomeObject@... 'inttest_log_device_11', ...]
[SomeObject@... 'inttest_log_device_12', ...]
[SomeObject@... 'inttest_log_device_13', ...]
[SomeObject@... 'inttest_log_device_14', ...]
[SomeObject@... 'inttest_log_device_15', ...]
[SomeObject@... 'inttest_log_device_16', ...]
[SomeObject@... 'inttest_log_device_17', ...]
[SomeObject@... 'inttest_log_device_18', ...]
[SomeObject@... 'inttest_log_device_19', ...]

第 1-3 页继续如上。

但是最后一页 (#4) 不同(预期的 ids [80, 99]):

[SomeObject@... 'inttest_log_device_25', ...]
[SomeObject@... 'inttest_log_device_94', ...]
[SomeObject@... 'inttest_log_device_0', ...]
[SomeObject@... 'inttest_log_device_31', ...]
[SomeObject@... 'inttest_log_device_62', ...]
[SomeObject@... 'inttest_log_device_13', ...]
[SomeObject@... 'inttest_log_device_69', ...]
[SomeObject@... 'inttest_log_device_33', ...]
[SomeObject@... 'inttest_log_device_64', ...]
[SomeObject@... 'inttest_log_device_52', ...]
[SomeObject@... 'inttest_log_device_86', ...]
[SomeObject@... 'inttest_log_device_24', ...]
[SomeObject@... 'inttest_log_device_16', ...]
[SomeObject@... 'inttest_log_device_22', ...]
[SomeObject@... 'inttest_log_device_89', ...]
[SomeObject@... 'inttest_log_device_50', ...]
[SomeObject@... 'inttest_log_device_57', ...]
[SomeObject@... 'inttest_log_device_92', ...]
[SomeObject@... 'inttest_log_device_29', ...]
[SomeObject@... 'inttest_log_device_15', ...]

执行的代码是:

someRepository.findAll(predicate, pageable);

存储库只是简单地扩展了 Spring 的 JpaRepositoryQuerydslPredicateExecutorpredicate 是带有一些过滤条件的 BooleanBuilder

此外,代码始终运行良好。升级后它就开始出现问题。

【问题讨论】:

  • 您的查询中确实有明确的排序依据(排序顺序)?否则它使用数据库返回的任何内容。
  • @M.Deinum 排序做到了!谢谢一堆。如果你愿意,你可以写一个实际的答案,我会接受的。

标签: java spring-boot hibernate spring-data-jpa


【解决方案1】:

如果没有明确的排序,您基本上将处于 DBMS 返回的危险之中。使用分页时,您应该始终有一个明确的顺序。

您可以通过将Sort 添加到您传入的Pageable 来做到这一点。

Pageable pageable = PageRequest.of(0, 1, Direction.ASC, "id);

类似的东西应该可以解决问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-05-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-07
    • 1970-01-01
    • 2015-07-31
    相关资源
    最近更新 更多