Spring 引导:Slice/Pageable 未根据页面返回正确的块
Spring Boot: Slice/Pageable not returning proper chunk based on page
在我的 PSQL 数据库中,我存储了两个对象,我想在它们各自的 page/slice 上检索每个项目。我试图通过传入以下页面对象来实现此目的:
第一项为 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);
}
}
你能试试用 Page 对象代替 Slice 吗?
第 1 步 - 创建页面大小
Pageable page1 = PageRequest.of(0, 1);
Pageable page2 = PageRequest.of(1, 1);
第 2 步
Page <Foo> findAllInactive(Date currentDate, Pageable page2);
Anshul 的评论让我走上了正确的轨道,最后,似乎创建了一个派生查询,如此处所述:https://www.baeldung.com/spring-data-derived-queries,有效。
最后,以下方法对我有用:
Slice<Foo> findByValidUntilIsNullOrValidUntilBefore(Date currentDate, Pageable pageable); // or can return a List<Foo>
在我的 PSQL 数据库中,我存储了两个对象,我想在它们各自的 page/slice 上检索每个项目。我试图通过传入以下页面对象来实现此目的:
第一项为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);
}
}
你能试试用 Page 对象代替 Slice 吗?
第 1 步 - 创建页面大小
Pageable page1 = PageRequest.of(0, 1);
Pageable page2 = PageRequest.of(1, 1);
第 2 步
Page <Foo> findAllInactive(Date currentDate, Pageable page2);
Anshul 的评论让我走上了正确的轨道,最后,似乎创建了一个派生查询,如此处所述:https://www.baeldung.com/spring-data-derived-queries,有效。
最后,以下方法对我有用:
Slice<Foo> findByValidUntilIsNullOrValidUntilBefore(Date currentDate, Pageable pageable); // or can return a List<Foo>