Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在spring中使用实体管理器实现分页_Spring_Hibernate_Jpa_Spring Data Jpa - Fatal编程技术网

在spring中使用实体管理器实现分页

在spring中使用实体管理器实现分页,spring,hibernate,jpa,spring-data-jpa,Spring,Hibernate,Jpa,Spring Data Jpa,如何在Spring+hibernate项目中实现分页? 下面是代码。我将获取PageRequest对象,并希望返回项目的页面 @Repository public class ItemRepository { @PersistenceContext EntityManager entityManager; public Page<Item> findItems(PageRequest pageRequest) { //

如何在Spring+hibernate项目中实现分页? 下面是代码。我将获取PageRequest对象,并希望返回项目的页面

 @Repository
    public class ItemRepository {

      @PersistenceContext
      EntityManager entityManager;

      public Page<Item> findItems(PageRequest pageRequest) {
        // TODO: Implement me
        return new Page<>(new ArrayList<>(), 0, 0);
      }
    }


    public class PageRequest {

      private final int count;
      private final int pageNumber;

      public PageRequest(int pageNumber, int count) {
        assert pageNumber >= 0;
        assert count > 0;

        this.pageNumber = pageNumber;
        this.count = count;
      }

      public int getCount() {
        return count;
      }

      public int getPageNumber() {
        return pageNumber;
      }
    }
@存储库
公共类项目存储库{
@持久上下文
实体管理器实体管理器;
公共页面findItems(PageRequest PageRequest){
//托多:实现我
返回新页面(newarraylist(),0,0);
}
}
公共类页面请求{
私人最终整数计数;
私人最终整版页码;
公共页面请求(整数页码、整数计数){
断言页码>=0;
断言计数>0;
this.pageNumber=页码;
this.count=计数;
}
public int getCount(){
返回计数;
}
public int getPageNumber(){
返回页码;
}
}

一种方法是在
PageRequest
类中添加逻辑,根据其
Pageable
方法参数对传入列表进行“切片”,并将其作为
org.springframework.data.domain.PageImpl
返回

下面是一个静态方法,您可以在
PageRequest
类中使用:

public static <E> Page<E> returnPagedList(Pageable pageable, List<E> listOfEntities) {
    List<E> listToReturn = listOfEntities;
    if (pageable.isPaged()) {
        int pageSize = pageable.getPageSize();
        int currentPage = pageable.getPageNumber();
        int startItem = currentPage * pageSize;
        if (listOfEntities.size() < startItem) {
            listToReturn = Collections.emptyList();
        } else {
            int toIndex = Math.min(startItem + pageSize, listOfEntities.size());
            listToReturn = listOfEntities.subList(startItem, toIndex);
        }
    }
    return new PageImpl<>(listToReturn, pageable, listOfEntities.size());
}
我找到了解决办法

public Page<Item> findItems(PageRequest pageRequest) {

    Query query = entityManager.createQuery("From Item");
    int pageNumber =pageRequest.getPageNumber();
    int pageSize = pageRequest.getCount();
    query.setFirstResult((pageNumber) * pageSize);
    query.setMaxResults(pageSize);
    List <Item> fooList = query.getResultList();

    Query queryTotal = entityManager.createQuery
            ("Select count(f.id) From Item f");
    long countResult = (long)queryTotal.getSingleResult();
    int i=(int)countResult;
    return new Page<>(fooList, pageRequest.getPageNumber(),i);
  }
publicpagefindItems(PageRequest-PageRequest){
Query Query=entityManager.createQuery(“来自项”);
int pageNumber=pageRequest.getPageNumber();
int pageSize=pageRequest.getCount();
query.setFirstResult((页码)*页面大小);
query.setMaxResults(页面大小);
List愚人列表=query.getResultList();
Query queryTotal=entityManager.createQuery
(“从f项中选择计数(f.id”);
long countResult=(long)queryTotal.getSingleResult();
int i=(int)countResult;
返回新页面(傻瓜列表,pageRequest.getPageNumber(),i);
}

我必须向DB查询两次,一次获取记录,然后获取所有计数

您是否知道,尽管您使用spring data jpa标记了问题,但您并没有真正使用它,它可以免费为您完成大部分工作?
public Page<Item> findItems(PageRequest pageRequest) {

    Query query = entityManager.createQuery("From Item");
    int pageNumber =pageRequest.getPageNumber();
    int pageSize = pageRequest.getCount();
    query.setFirstResult((pageNumber) * pageSize);
    query.setMaxResults(pageSize);
    List <Item> fooList = query.getResultList();

    Query queryTotal = entityManager.createQuery
            ("Select count(f.id) From Item f");
    long countResult = (long)queryTotal.getSingleResult();
    int i=(int)countResult;
    return new Page<>(fooList, pageRequest.getPageNumber(),i);
  }