Solucionado (ver solução)
Solucionado
(ver solução)
4
respostas

Function + JPA

Tenho uma function que retorna o total de contas a pagar por mes uma tabela.

CREATE OR REPLACE FUNCTION totalContasAPagarPorMes(dataInicial DATE, dataFinal DATE) RETURNS TABLE(mes DOUBLE PRECISION, total NUMERIC(19,2)) AS $BODY$
DECLARE
    var_r record;

BEGIN

   FOR var_r IN (SELECT EXTRACT(MONTH FROM vencimento) AS mes,
           SUM(CASE WHEN moeda_id = (SELECT moedapadrao_id FROM configuracao) THEN valor 
               ELSE (SELECT converterValorNaMoeda(valor,(SELECT cotacaoEntreMoedasNaEmissao((SELECT moedapadrao_id FROM configuracao),moeda_id,emissao)),moeda_id)) END) as total

                   FROM cobranca AS c 
                   WHERE c.vencimento::date BETWEEN dataInicial AND dataFinal
                    AND c.vencimento::time BETWEEN '00:00:00' AND '23:59:59'
                    AND (c.cobranca_classe_nome = 'TITULO' OR cobranca_classe_nome = 'DESPESA_PROVISIONADA')
                    AND operacaofinanceira = 'SAIDA'
             GROUP BY 1
             ORDER BY 1 ASC)
   LOOP
           mes := var_r.mes;
        total := var_r.total;
        RETURN NEXT;
   END LOOP;

    END;
$BODY$ LANGUAGE plpgsql;

Criei no java uma classe que receberia esses valores na consulta da function.

public class TotalNoMes {

    private Double mes;
    private BigDecimal total;

    public TotalNoMes(Double mes, BigDecimal total) {
        this.mes = mes;
        this.total = total;
    }

    public Double getMes() {
        return mes;
    }

    public void setMes(Double mes) {
        this.mes = mes;
    }

    public BigDecimal getTotal() {
        return total;
    }

    public void setTotal(BigDecimal total) {
        this.total = total;
    }

    @Override
    public String toString() {
        return "TotalNoMes{" + "mes=" + mes + ", total=" + total + '}';
    }

}

Gostaria de saber como eu faço o select dessa function com JPA. Uso o postgres como banco de dados.

Alguém sabe como fazer essa consulta?

4 respostas

Oi Rafael, tudo bem ?

Receio que a melhor forma seja você transformar sua função em código, ou para jpql, ou até mesmo nativo caso não rolar na jpql.

Eu não poderia fazer em código nativo pois para cada valor de despesa eu necessito converter o valor na moeda correta e para isso preciso buscar a cotação na hora da emissão. Ou seja pra cada registro é necessário 3 consultas no banco, isso faria a transação ficar muito custosa quando se tem muitos registros.

Transformar em JPQL não seria viável devido a esse acoplamento de funções, pois se mudar a regra de conversão de moedas ou até mesmo de busca de cotações, eu teria que mudar nesse código também, o que poderia ocasionar um erro na aplicação.

Não existe nenhuma forma de buscar a função no banco e trazer a informação?

solução!

Olá Rafael,

existe este artigo que mostra como invocar uma procedure ou function usando o JPA. Vai dar um trabalhinho porque o parse para a sua classe você terá que fazer quase que na mão, mas pelo menos você consegue receber o retorno da function.

Ok, vou tentar e respondo aqui.