搜索功能中的排序顺序

时间:2019-05-16 15:50:24

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

我使用以下代码通过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")));
      }

2 个答案:

答案 0 :(得分:4)

JpaSpecificationExecutor外,您不需要其他任何内容。 Spring将使用此界面自动创建:

  

Page<T> findAll(@Nullable Specification<T> spec, Pageable pageable)

您似乎正在寻找的方法。因此,不清楚是什么问题,也许您正在导入错误的类?或者,如果您只想使用PageRequestgetAllBySpecificationpage生成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参数中提取pageSizePageable并使用它们来创建自定义PageRequestPageRequest我在演示代码中包含的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特殊参数处理中进行了描述。