spring jpa findAll(Pageable pageable)方法源码浅析
最近和同事讨论了一下,
public Page<T> findAll(Pageable pageable)

上面这个方法返回的page对象里面的总条数是怎么来的,同事说是通过两次和数据库的交互获取到的,我说是通过spring data自己实现的,通过看源码还是自己的猜想是正确的的

public Page<T> findAll(Pageable pageable) {

		if (null == pageable) {
			return new PageImpl<T>(findAll());
		}

		return findAll(null, pageable);
	}
public Page<T> findAll(Specification<T> spec, Pageable pageable) {

		TypedQuery<T> query = getQuery(spec, pageable);
		return pageable == null ? new PageImpl<T>(query.getResultList()) : readPage(query, pageable, spec);
	}

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

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

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

		return new PageImpl<T>(content, pageable, total);
	}
通过上面几个方法可以看出无论那个方法最后都是生成下面这个对象
new PageImpl<T>(content, pageable, total);
public PageImpl(List<T> content, Pageable pageable, long total) {

		super(content, pageable);

		this.pageable = pageable;
		this.total = !content.isEmpty() && pageable != null && pageable.getOffset() + pageable.getPageSize() > total
				? pageable.getOffset() + content.size() : total;
}

通过这个对象的构造方法能明显的看到,返回的page对象的总数是通过一次查询返回的结果的list里面进行获取的,而不是通过进行第二次的数据库交互通过select count() from table来获取的。

小压同事一波,黄焖鸡来了!O(∩_∩)O

阅读更多
个人分类: spring 计算机
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

不良信息举报

spring jpa findAll(Pageable pageable)方法源码浅析

最多只允许输入30个字

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭