java.lang.IllegalStateException: No explicit selection and an implicit one could not be determined

Estou seguindo um curso e tomei um erro…

java.lang.IllegalStateException: No explicit selection and an implicit one could not be determined

Esse erro acontece na linha:

return new PageImpl<>(query.getResultList(), pageable, total(lancamentoFilter));

> public class LancamentoRepositoryImpl implements LancamentoResositoryQuery {
> 
> 	@PersistenceContext
> 	private EntityManager manager;
> 
> 	@Override
> 	public Page<Lancamento> filtrar(LancamentoFilter lancamentoFilter , Pageable pageable) {
> 		CriteriaBuilder builder = manager.getCriteriaBuilder();
> 		CriteriaQuery<Lancamento> criteria = builder.createQuery(Lancamento.class);
> 		Root<Lancamento> root = criteria.from(Lancamento.class);
> 
> 		Predicate[] predicates = criarRestricoes(lancamentoFilter, builder, root);
> 		criteria.where(predicates);
> 		criteria.select(root);
> 		
> 		TypedQuery<Lancamento> query = manager.createQuery(criteria);
> 		adicionarPaginacao(query, pageable);
> 		return new PageImpl<>(query.getResultList(), pageable, total(lancamentoFilter));
> 	}
> 
> 	private Predicate[] criarRestricoes(LancamentoFilter lancamentoFilter, CriteriaBuilder builder,
> 			Root<Lancamento> root) {
> 
> 		List<Predicate> predicates = new ArrayList<Predicate>();
> 
> 		if (!StringUtils.isEmpty(lancamentoFilter.getDescricao())) {
> 			predicates.add(builder.like(
> 					// META MODEL DEPENDENCIA NO POM jpamodelgen CRIA CLASSES PARA QUE ESCREVA
> 					// Lancamento_.DESCRICAO no lugar de "descricao" para evitar erros
> 					builder.lower(root.get(Lancamento_.DESCRICAO)),
> 					"%" + lancamentoFilter.getDescricao().toLowerCase() + "%"));
> 		}
> 
> 		if (lancamentoFilter.getDataVencimentoDe() != null) {
> 			predicates.add(builder.greaterThanOrEqualTo(root.get(Lancamento_.DATA_VENCIMENTO),
> 					lancamentoFilter.getDataVencimentoDe()));
> 		}
> 
> 		if (lancamentoFilter.getDataVencimentoAte() != null) {
> 			predicates.add(builder.lessThanOrEqualTo(root.get(Lancamento_.DATA_VENCIMENTO),
> 					lancamentoFilter.getDataVencimentoAte()));
> 		}
> 
> 		return predicates.toArray(new Predicate[predicates.size()]);
> 	}
> 	
> 	private void adicionarPaginacao(TypedQuery<Lancamento> query, Pageable pageable) {
> 		int paginaAtual = pageable.getPageNumber();
> 		int totalRegistrosPorPagina = pageable.getPageSize();
> 		int primeiroRegistroDaPagina = paginaAtual * totalRegistrosPorPagina;
> 		
> 		query.setFirstResult(primeiroRegistroDaPagina);
> 		query.setMaxResults(totalRegistrosPorPagina);
> 		
> 		
> 	}
> 	
> 
> 	private Long total(LancamentoFilter lancamentoFilter) {
> 		CriteriaBuilder builder = manager.getCriteriaBuilder();
> 		CriteriaQuery<Long> criteria = builder.createQuery(Long.class);
> 		Root<Lancamento> root = criteria.from(Lancamento.class);
> 		
> 		Predicate[] predicates = criarRestricoes(lancamentoFilter, builder, root);
> 		criteria.where(predicates);
> 				
> 		return manager.createQuery(criteria).getSingleResult();
> 	}
> 
> 
> }

Alguem conseguiria me ajudar?

Tem certeza de que o seu query.getResultList() está trazendo algum dado?

Primeiro obrigado pela resposta staroski!
getResult estava trazendo sim.
O problema estava dentro do método total(),
faltou a linha criteria.select(builder.count(root)); para fazer o count.

agora segue como ele deveria ficar:

private long total(LancamentoFilter lancamentoFilter) {
CriteriaBuilder builder = manager.getCriteriaBuilder();
CriteriaQuery criteria = builder.createQuery(long.class);
Root root = criteria.from(Lancamento.class);

  Predicate[] predicates = criarRestricoes(lancamentoFilter, builder, root);
  criteria.where(predicates);
  
  criteria.select(builder.count(root));
  		
  return manager.createQuery(criteria).getSingleResult();

}

1 curtida