当前位置: 首页 > 知识库问答 >
问题:

当规格和分页同时使用时,如何禁用计数?

佟阳飙
2023-03-14
Page<T> findAll(Specification<T> spec, Pageable pageable)

List<T> findAll(Specification<T> spec)

List<T> findAll(Specification<T> spec, Sort sort)
Slice<T> findAll(Specification<T> spec, Pageable pageable)

List<T> findAll(Specification<T> spec, Pageable pageable)

共有1个答案

归鸿朗
2023-03-14

查看SimpleJParepository的findall(Specification,Pageable)readpage(TypedQuery,Pageable,Specification)方法。Spring的实现似乎总是执行count查询,并在执行select查询之前检查startIndex是否在范围之外:

protected Page<T> readPage(TypedQuery<T> query, Pageable pageable, Specification<T> spec) {

    query.setFirstResult(pageable.getOffset());
    query.setMaxResults(pageable.getPageSize());

    Long total = QueryUtils.executeCountQuery(getCountQuery(spec));
    List<T> content = total > pageable.getOffset() ? query.getResultList() : Collections.<T> emptyList();

    return new PageImpl<T>(content, pageable, total);
}

我不相信这总是最好的做法。例如,在我的用例中,我们很乐意在前面执行一次计数查询,而不是在后面的调用中执行,因为我们知道新数据不会频繁地来保证计数更新,而且计数查询执行起来非常昂贵。

如果Spring Data可以提供一个标志或一个替代方法来禁用count for cerritione查询,就像简单的find查询一样,那就太好了。

@Repository
public class CriteriaNoCountDao {

    @PersistenceContext
    protected EntityManager em;

    public <T, ID extends Serializable> Page<T> findAll(Specification<T> spec, Pageable pageable, Class<T> clazz){
        SimpleJpaNoCountRepository<T, ID> noCountDao = new SimpleJpaNoCountRepository<T, ID>(clazz, em);
        return noCountDao.findAll(spec, pageable);
    }

    /**
     * Custom repository type that disable count query.
     */
    public static class SimpleJpaNoCountRepository<T, ID extends Serializable> extends SimpleJpaRepository<T, ID> {

        public SimpleJpaNoCountRepository(Class<T> domainClass, EntityManager em) {
            super(domainClass, em);
        }

        /**
         * Override {@link SimpleJpaRepository#readPage(TypedQuery, Pageable, Specification)}
         */
        protected Page<T> readPage(TypedQuery<T> query, Pageable pageable, Specification<T> spec) {
            query.setFirstResult(pageable.getOffset());
            query.setMaxResults(pageable.getPageSize());

            List<T> content = query.getResultList();

            return new PageImpl<T>(content, pageable, content.size());
        }
    }
}
 类似资料:
  • 我正在使用boto3客户端访问存储在亚马逊S3桶中的日期。阅读文档后,我看到我可以用下面的代码提出请求:我对存储了3000个对象的桶进行测试,这段代码检索对所有对象的引用。我听说所有对S3的API调用最多返回1000个条目。 但是阅读boto3留档分页器部分,我看到一些S3操作需要使用分页来检索所有结果。我不明白为什么上面的代码工作,除非代码使用引擎盖下的分页器。这是我的问题,我可以安全地假设上层

  • 问题内容: 我想知道在使用selenium时如何禁用javascript,以便可以测试服务器端验证。 我找到了这篇文章,但我不知道该怎么做。就像我制作此javascript文件,然后呢? http://thom.org.uk/2006/03/12/disabling-javascript-from- selenium/ 问题答案: 编辑 在此期间,确实出现了更好的替代方法,请参见其他答案,例如 如

  • 问题内容: 如何使用和在一起? personelRepository.java personelService.java personelController.java 当我运行它时,会出现这样的错误。但是,如果我像findAll(Pageable page)和findAll(Specification filter)一样分别调用findAll()函数,它将起作用。但是我不能一起使用。 问题答案:

  • 问题内容: 我已通过solr facet stats从solr中选择了所有记录,但无法对其进行分页,如何按pageSize和pageNum分页? 问题答案: 使用solr facet统计信息时无法分页,因为使用solr facet统计信息将统计所有文档。

  • 我必须使用WebClient进行分页API调用,并最终组合所有结果。例如:个人最新1000交易详情。在一次调用中,我将在json响应(List)中获得最大100个对象。这个人最多只能得到1000条记录。 在伪代码java中,它可能看起来像这样 如何在SpringMVC中以反应式方式编写相同的内容而不阻塞? 像这样的东西???我不知道。帮助我

  • 问题内容: 我正在尝试使用这种格式来格式化当前时间。 输出: 有什么建议? 问题答案: 用 由于Go使用以下常量来格式化日期,请参阅此处