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); 
                                
        }