Erro ao fazer um SELECT com CriteriaQuery

Boa noite a todos!

Estou com muita dificuldade para fazer um select usando CriteriaQuery.
Mais precisamente este select:

SELECT sum(valor) as valor FROM despesas WHERE situacao = 'A PAGAR' and usuarios_id = ?

Usando CriteriaQuery ficaria assim:

CriteriaBuilder builder = em.getCriteriaBuilder();
CriteriaQuery<BigDecimal> criteriaQuery = builder.createQuery(BigDecimal.class);
Root<Despesas> root = criteriaQuery.from(Despesas.class);
criteriaQuery.select(builder.sum(root.get("valor")));
criteriaQuery.where((builder.equal(root.get("situacao"), "PAGO")), builder.and(builder.equal(root.get("usuariosId"), 2))); // O PROBLEMA ESTÁ NESTA PARTE... 
BigDecimal result = em.createQuery(criteriaQuery).getSingleResult();
return result;

Esse código está gerando este erro:

[EL Warning]: 2020-02-26 21:18:37.549--UnitOfWork(539762238)--Exception [EclipseLink-6078] (Eclipse Persistence Services - 2.5.2.v20140319-9ad6abd): org.eclipse.persistence.exceptions.QueryException
Exception Description: The class of the argument for the object comparison is incorrect. 
Expression: [
Base br.com.easypaper.model.Despesas] 
Mapping: [org.eclipse.persistence.mappings.ManyToOneMapping[usuariosId]] 
Argument: [2]
Query: ReportQuery(referenceClass=Despesas )
javax.persistence.PersistenceException: Exception [EclipseLink-6078] (Eclipse Persistence Services - 2.5.2.v20140319-9ad6abd): org.eclipse.persistence.exceptions.QueryException
Exception Description: The class of the argument for the object comparison is incorrect. 
Expression: [
Base br.com.easypaper.model.Despesas] 
Mapping: [org.eclipse.persistence.mappings.ManyToOneMapping[usuariosId]] 
Argument: [2]

Se eu retirar esta parte funciona, mas não filtra as despesas pelo usuário com id 2 (Exemplo).

builder.and(builder.equal(root.get("usuariosId"), "2")));

Pq ta usando Criteria se é a forma mais complicada?

Pra montar a cláusula where com criteria você poderia criar um array de predicates com as condições separadamente.

Aqui tem um exemplo da montagem de uma Query usando jpql e um exemplo usando criteria:

Desta forma funciona:

try {
            em.getTransaction().begin();
            TypedQuery<BigDecimal> query = em.createQuery("SELECT sum(d.valor) FROM Despesas d WHERE d.situacao = 'PAGO' and d.usuariosId.id = :id ORDER BY d.vencimento", BigDecimal.class);
            return query.setParameter("id", Integer.parseInt(MainScreenFXMLController.getId())).getSingleResult();
        } catch (NumberFormatException e) {
            if (em.isOpen()) {
                em.getTransaction().rollback();
            }
            Alerts.showAlert("Easypaper-FX", null, e.getMessage(), Alert.AlertType.ERROR);
            return null;
        } finally {
            if (em.isOpen()) {
                em.close();
            }
        }

Mas fica aparecendo um aviso : The argument must be numeric

Tenta assim:

Query query = em.createQuery("SELECT sum(d.valor) ...");
query.setParameter("id", 123);
BigDecimal result = (BigDecimal)query.getSingleResult();

Não dando certo substitui a última linha por

Object result = query.getSingleResult();

E veja qual tipo vem de fato.

Obs.:

não faz sentido order by se quer fazer apenas um sum.

nao precisa abrir transação pra fazer select, vai consumir recurso do banco a toa.

O meu método precisa retornar um BigDecimal se eu fizer a query retornar um Object não vai funcionar.

O Netbeans sugeri inserir a anotação @SuppressWarnings("JPQLValidation"). Incluindo esta anotação para de aparecer o aviso.

Não é pra usar Object, isso foi só pra voce debugar e ver qual tipo vem de fato, se nesse object vem Number, BigDecimal ou Double. E assim fazer o cast correto.

Tópico resolvido!