Spring Boot:Slice/Pageable 未根据页面返回正确的块
Posted
技术标签:
【中文标题】Spring Boot:Slice/Pageable 未根据页面返回正确的块【英文标题】:Spring Boot: Slice/Pageable not returning proper chunk based on page 【发布时间】:2021-06-18 11:59:08 【问题描述】:在我的 PSQL DB 中,我存储了两个对象,我想在它们单独的页面/切片上检索每个项目。我试图通过传入以下 Page 对象来实现这一点:
PageRequest.of(0,1)
用于第一项,PageRequest.of(1, 1)
用于第二项。
但是,当我通过PageRequest.of(1, 1)
创建Pageable
对象时,这总是导致每次只返回第一个项目,但我通过调用repo.findAll()
确认这两个项目确实存在。
我做错了什么?
我的服务层调用如下所示:
@Transactional
public Slice<Foo> findAllInactive(Pageable pageable)
return repo.findAllInactive(new Date(), pageable));
我的仓库是:
@Repository
public interface FooRepository extends JpaRepository<Foo, String>
value =
"SELECT * FROM fooschema.foo i WHERE i.valid_until < :currentDate OR i.valid_until IS NULL --#pageable\n",
nativeQuery = true,
countQuery = "SELECT count(*) FROM fooschema.foo i")
Slice<Foo> findAllInactive(@Param("currentDate") Date currentDate, Pageable pageable);
如果有什么不同,这里是测试调用
@Autowired private MockMvc mvc;
@Test
void testStuff() throws Exception
// two elements added....
ResultActions resultActions =
mvc.perform(
get("/foo")
.param("page", "1")
.param("size", "1"))// should return the second element, but returns the first
.andExpect(status().isOk())
.andExpect(content().contentType("application/json"));
和控制器
@RestController
@RequestMapping("/foo")
public class FooController
@GetMapping
@ApiImplicitParams(
@ApiImplicitParam(
name = "page",
dataType = "int",
paramType = "query",
value = "Page you want to retrieve",
defaultValue = "0"),
@ApiImplicitParam(
name = "size",
dataType = "int",
paramType = "query",
value = "Number of foo per page.",
defaultValue = "10"))
public Slice<Foo> getFoo(Pageable pageable)
return service.findAllInactive(pageable);
【问题讨论】:
如果你用 PageRequest.of(0,2) 调用它会得到两个元素吗? @SimonMartinelli 是的,当我拨打电话时,我得到了这两个元素 您可以订购您的结果并尝试查询吗? 【参考方案1】:你可以尝试使用 Page 对象而不是 Slice。
第 1 步 - 创建页面大小
Pageable page1 = PageRequest.of(0, 1);
Pageable page2 = PageRequest.of(1, 1);
第二步
Page <Foo> findAllInactive(Date currentDate, Pageable page2);
【讨论】:
奇怪,这会返回 PageRequest.of(1, 1) 的两个元素....但仍然无法按预期工作 PageRequest.of(0, 1) 也是如此 你需要使用类似“findByCurrentDateInactive”这样的JPA repo方法 这不起作用,但是,我注意到语法实际上是这样的“findByValidUntilBefore”,并且实际上似乎有效,如此处所述:baeldung.com/spring-data-derived-queries【参考方案2】:Anshul 的评论让我走上了正轨,最后,似乎创建派生查询(如下所述:https://www.baeldung.com/spring-data-derived-queries)是可行的。
最后,以下内容对我有用:
Slice<Foo> findByValidUntilIsNullOrValidUntilBefore(Date currentDate, Pageable pageable); // or can return a List<Foo>
【讨论】:
以上是关于Spring Boot:Slice/Pageable 未根据页面返回正确的块的主要内容,如果未能解决你的问题,请参考以下文章
为啥 Spring Boot 应用程序 pom 同时需要 spring-boot-starter-parent 和 spring-boot-starter-web?
《02.Spring Boot连载:Spring Boot实战.Spring Boot核心原理剖析》