Java - JPA通过Query接口setMaxResults实现limit限制查询条数

实现JPA的限制查询功能

要实现JPA的limit限制查询功能,可以通过 JPA Query 接口中的 setMaxResults 方法来实现指定最大结果返回多少条。如果不通过 setMaxResults 设置最大返回条数,JPA默认最大返回 Integer 的上限,即 Integer.MAX_VALUE,这个数字是21亿左右。

可以参考这个官方文档地址:https://docs.oracle.com/javaee/6/tutorial/doc/bnbrg.html

setMaxResults实战应用

以下代码为个人项目中实现限制查询的关键代码,可作为参考。

public class CustomJpaRepositoryBean<T, ID extends Serializable> extends SimpleJpaRepository<T, ID> implements CustomJpaRepository<T, ID> {
	
	// ...
	// 其他代码省略
	// ...
	
	// 由于继承了 SimpleJpaRepository、CustomJpaRepository,这里重写父类的方法
	@Override
	public Page<T> findAll(Specification<T> spec, Pageable pageable) {
	    // 如果是XXX类型的查询(注:XXX 实现了 Specification 接口)
	    // 这里请更换为自己的类,仅做参考
	    if (spec instanceof XXX) {
	        return findAllWithLimt(spec, pageable);
	    } else {
	        // 其他类型的查询,调用父类的查询实现
	        return super.findAll(spec, pageable);
	    }
	}
	
	/**
	 * 实现限制总条数的查询
	 * @param spec 查询范式
	 * @param pageable 分页对象
	 * @return 返回数据分页对象
	 */
	@SuppressWarnings("unchecked")
	private Page<T> findAllWithLimt(Specification<T> spec, Pageable pageable) {
	    // 查询限制条数的结果
	    final TypedQuery query = this.getQuery(spec, pageable);
	    // 限制查询500条(无论什么条件,最多只返回500条)
	    query.setMaxResults(500);
	    // 得到查询结果
	    final List<T> list = query.getResultList();
	    // 根据pageable分页对象,用guava拆分集合,并返回对应的分页数据
	    final List<List<T>> partition = Lists.partition(list, pageable.getPageSize());
	    // 得到分页数据(默认0条,必须判空)
	    List<T> pageContent = new ArrayList<>(0);
	    if (!list.isEmpty()) {
	    	  // 取第几页,就去拿拆分集合容器里面对应的索引即可(注意,下标从0开始)
	        pageContent = partition.get(pageable.getPageNumber());
	    }
	    return new PageImpl<>(pageContent, pageable, list.size());
	}

}

你可能感兴趣的:(Java)