Java 如何以页面形式获取JPA自定义查询的结果
我有一个存储库,它返回一个Java 如何以页面形式获取JPA自定义查询的结果,java,spring,jpa,orm,pagination,Java,Spring,Jpa,Orm,Pagination,我有一个存储库,它返回一个页面: 但是getResultList()返回列表,而不是页面:( 解决此问题的最佳方法是什么?如果要使用EntityManager.createQuery,则会为您提供setFirstResult和setMaxResults方法以获得相同的结果 @Override public List<Mind> findByCountry(String country, Pageable pageable) { return em.createQuery(&quo
页面
:
但是getResultList()
返回列表
,而不是页面
:(
解决此问题的最佳方法是什么?如果要使用
EntityManager.createQuery
,则会为您提供setFirstResult
和setMaxResults
方法以获得相同的结果
@Override
public List<Mind> findByCountry(String country, Pageable pageable) {
return em.createQuery("from minds where <dynamical filter> AND <another dynamical filter> AND <...etc>", Mind.class)
.setFirstResult(startPosition)
.setMaxResults(size)
.getResultList();
}
但是,如果需要建立DyMic查询-考虑使用或JPA标准API。
UL>@覆盖
公共页findByCountry(字符串国家,可分页){
长偏移量=pageable.getPageNumber()*pageable.getPageSize();
long limit=pageable.getPageSize();
List itemXtpage=em.createQuery(查询)
.setFirstResult(偏移量)
.setMaxResults(限制)
.getResultList();
long total=//另一个获取总计数的查询
列表结果=em.createQuery(“来自minds…”,Mind.class)
.getResultList();
返回新的PageImpl(结果、可分页、总计);
}
你试过了吗?@ruba谢谢!它一定有用。但出于某些原因,我现在更喜欢原生SQL,所以我尝试Kavithakaran方法。如果你启用Spring数据web支持扩展和QueryDSL扩展,你将获得所有这些(即排序、筛选(按动态条件)和页面)无需编写任何代码。它返回List
。但前端需要的不是纯列表,而是json格式的所有分页信息
private MindRepository mindRepository;
@GetMapping(path = "/minds", produces = "application/json")
public Page<Mind> getMinds(String country, Integer page, Integer size) {
Pageable pageable = PageRequest.of(page,size);
return mindRepository.findByCountry(country,pageable);
}
public interface CustomizedMindRepository<T> {
Page<T> findByCountry(String country, Pageable pageable);
}
public interface MindRepository extends PagingAndSortingRepository<Mind, Integer>,CustomizedMindRepository {
Page<Mind> findByCountry(String country, Pageable pageable);
}
public class CustomizedMindRepositoryImpl implements CustomizedMindRepository {
@PersistenceContext
private EntityManager em;
@Override
public Page<Mind> findByCountry(String country, Pageable pageable) {
return em.createQuery("from minds where <dynamical filter> AND <another dynamical filter> AND <...etc>", Mind.class)
.getResultList();
}
}
@Override
public List<Mind> findByCountry(String country, Pageable pageable) {
return em.createQuery("from minds where <dynamical filter> AND <another dynamical filter> AND <...etc>", Mind.class)
.setFirstResult(startPosition)
.setMaxResults(size)
.getResultList();
}
startPosition = page * size
@Override
public Page<Mind> findByCountry(String country, Pageable pageable) {
long offset = pageable.getPageNumber() * pageable.getPageSize();
long limit = pageable.getPageSize();
List<Item> itemsInNextPage = em.createQuery(query)
.setFirstResult(offset)
.setMaxResults(limit)
.getResultList();
long total = // Another query to get the total count
List<Mind> results = em.createQuery("from minds ...", Mind.class)
.getResultList();
return new PageImpl(results, pageable, total);
}