我使用以下代码通过JPA和Spring获取数据库行:
return transactionService.findAll(page, size)
public Page<PaymentTransactions> findAll(int page, int size) {
return dao.findAll(PageRequest.of(page,size, new Sort(Sort.Direction.DESC, "createdAt")));
}
我想对此代码实施相同的排序:
return transactionService.getAllBySpecification(specification, pageable)
@Override
public Page<PaymentTransactions> getAllBySpecification(final Specification<PaymentTransactions> specification, final Pageable pageable) {
return dao.findAll(specification, pageable);
}
您知道我如何使用规范实现按列的排序方向。像这样:
return dao.findAll(specification, PageRequest.of(page,size, new Sort(Sort.Direction.DESC, "createdAt")));
其他问题:
我可以设置具有排序方向的Pagable对象吗?像这样:
@Override
public Page<PaymentTransactions> getAllBySpecification(final Specification<PaymentTransactions> specification, final Pageable pageable) {
return dao.findAll(specification, PageRequest.of(pageable, new Sort(Sort.Direction.DESC, "createdAt")));
}
答案 0 :(得分:4)
除JpaSpecificationExecutor
外,您不需要其他任何内容。 Spring将使用此界面自动创建:
Page<T> findAll(@Nullable Specification<T> spec, Pageable pageable)
您似乎正在寻找的方法。因此,不清楚是什么问题,也许您正在导入错误的类?或者,如果您只想使用PageRequest
和getAllBySpecification
为page
生成size
,则可以有以下内容:
public Page<Entity> getAllBySpecification(
Specification<Entity> specification,
int page, int size) {
return dao.findAll(specification, createMyPageRequest(page, size));
}
private PageRequest createMyPageRequest(int page, int size) {
return PageRequest.of(page, size, new Sort(Sort.Direction.DESC, "createdAt"));
}
无论如何,如果您需要这些API的完整编译示例...
能给我看看一些代码示例吗?
...这里是
import org.springframework.data.domain.*;
import org.springframework.data.jpa.domain.Specification;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
public class SortFunctionality {
private Dao dao;
public Page<Entity> findAll(int page, int size) {
return dao.findAll(createMyPageRequest(page, size));
}
public Page<Entity> getAllBySpecification(
Specification<Entity> specification,
int page, int size) {
return dao.findAll(specification, createMyPageRequest(page, size));
}
public Page<Entity> getAllBySpecification(
Specification<Entity> specification,
Pageable pageable) {
PageRequest pageRequest = createMyPageRequest(
pageable.getPageNumber(),
pageable.getPageSize());
return dao.findAll(specification, pageRequest);
}
private PageRequest createMyPageRequest(int page, int size) {
return PageRequest.of(page, size, new Sort(Sort.Direction.DESC, "createdAt"));
}
static interface Dao extends
JpaRepository<Entity, Integer>, JpaSpecificationExecutor<Entity> {}
static class Entity {}
}
其他问题的编辑:
是的,您可以通过从pageNumber
参数中提取pageSize
和Pageable
并使用它们来创建自定义PageRequest
(PageRequest
我在演示代码中包含的createMyPageRequest
实用程序对硬编码的排序条件进行了编码。最后,您可以像往常一样使用该PageRequest
来调用findAll
方法:
public Page<Entity> getAllBySpecification(
Specification<Entity> specification,
Pageable pageable) {
PageRequest pageRequest = createMyPageRequest(
pageable.getPageNumber(),
pageable.getPageSize());
return dao.findAll(specification, pageRequest);
}
我更新了之前的完整演示,以反映这一新功能。此外,它还有一点重构,因此,如果将此新方法粘贴到该演示的副本先前版本上,则会出现错误。
希望这会有所帮助。
答案 1 :(得分:0)
您只能使用命名约定,并让Spring为您生成实现。您必须使用Spring数据JPA存储库。您可以按照给出的示例并相应地重构逻辑。
https://docs.spring.io/spring-data/jpa/docs/current/reference/html/#repositories.special-parameters
它也是一个接受参数Pageable。 请查看示例:
List<Person> findByLastnameOrderByFirstnameDesc(String lastname);
还有一个:
Page<User> findByLastname(String lastname, Pageable pageable);
可分页和切片在4.4.4特殊参数处理中进行了描述。