在spring中使用实体管理器实现分页
如何在Spring+hibernate项目中实现分页? 下面是代码。我将获取PageRequest对象,并希望返回项目的页面在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) { //
@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);
}