如何使用typedQuery在Criteria api上添加分页?

问题描述 投票:0回答:1

[我正在使用具有pageable的Criteria API来返回具有pageable的Page<MyClass>,但是当我插入setFirstResultsetMaxResults时,查询总是返回10个元素。

如果我从TypedQuery中删除setFirstResultsetMaxResults,则我的typedQuery.getResultList()返回所有元素,但显然没有分页。

我有一项服务可以调用我的条件,以发送我的主要功能peopleRepository.filter的可分页代码>

public Page<People> filtrarParcial(String name, String rg, String mom, String cpf, String nickname, Integer pageNumber, Integer pageSize, List<String> sort) {
    List<Sort.Order> orders = new ArrayList<>();

    PageRequest pageRequest = PageRequest.of(pageNumber, pageSize, Sort.by(orders));

    Page<People> listPeople = peopleRepository.filter(name, rg, mom, cpf, nickname, pageRequest);

    return listPeople;
}

我的存储库工具

@Service
public class PeopleRepositoryImpl implements PeopleRepositoryQueries {
    @PersistenceContext
    private EntityManager manager;

    @Transactional(readOnly = true)
    public Page<People> filter(String name, String rg, String mom, String cpf, String nickname, Pageable pageable) {

        CriteriaBuilder criteriaBuilder = manager.getCriteriaBuilder();
        CriteriaQuery<People> query = criteriaBuilder.createQuery(People.class);

        Root<People> root = query.from(People.class);

        Path<String> nomePath = root.<String>get("name");

        List<Predicate> predicates = new ArrayList<Predicate>();

        if(!nome.equals("")) {
            Predicate nomeIgual = criteriaBuilder.like(nomePath, "%" +name.toUpperCase() + "%");
            predicates.add(nomeIgual);
        }

        query.where((Predicate[]) predicates.toArray(new Predicate[0]));

        int paginaAtual = pageable.getPageNumber();
        int totalRegistrosPorPagina = pageable.getPageSize();
        int primeiroRegistro = paginaAtual * totalRegistrosPorPagina;

        TypedQuery<People> typedQuery = manager.createQuery(query);

//      typedQuery.setFirstResult(primeiroRegistro);
//      typedQuery.setMaxResults(totalRegistrosPorPagina);

        Integer totalRows = typedQuery.getResultList().size();

        Long total = totalRows.longValue();
        return new PageImpl<>(typedQuery.getResultList(), pageable, total);
    }

例如,如果我搜索名称为marcos

的人,则typedQuery.getResultList()仅按页同时返回10个元素和相同编号的元素(在我的数据库中为180)。如果我删除此
typedQuery.setFirstResult(primeiroRegistro);
typedQuery.setMaxResults(totalRegistrosPorPagina);

然后typedQuery.getResultList()返回180个元素但有分页,并且所有180个元素都在没有分页的单个页面中

我正在使用具有pageable的Criteria API返回具有pageable的Page ,但是当我插入setFirstResult和setMaxResults时,查询始终返回10个元素。如果我删除...

java spring spring-boot criteria-api
1个回答
0
投票

尝试以下配置。

© www.soinside.com 2019 - 2024. All rights reserved.