调用过程 /功能JPA Hibernate



大家好,我在Postgres SQL中有一个程序,我正在尝试使用JPA Hibernate调用它,但是我遇到了错误。

    select * from myprocedure(2016, 3, 0, 0,0)
AS f(descricao varchar, itens integer, quantidade bigint, valor numeric)

在这里我尝试在Java中做的事情。

StringBuilder sb = new StringBuilder();
            sb.append(" SELECT * ");
            sb.append(" FROM myprocedure( ");
            sb.append(" :ano , ");
            if (Util.isNotNull(mes)) {
                sb.append(":mes , ");
            }
            sb.append(" :codNre , ");
            sb.append(" :codMun , ");
            sb.append(" 0) ");
            sb.append(" AS f(descricao varchar, itens integer, quantidade bigint, valor numeric) ");
            TypedQuery<Tuple> query = em.createQuery(sb.toString(), Tuple.class);
            query.setParameter("ano", ano);
            if (Util.isNotNull(mes)) {
                query.setParameter("mes", mes);
            }
            query.setParameter("codNre", codNre);
            query.setParameter("codMun", codMun);
            List<ResumoDistribuicaoMerendaDTO> listaRetorno = new ArrayList<ResumoDistribuicaoMerendaDTO>();
            List<Tuple> results = query.getResultList();
            for (Tuple result : results) {
                ResumoDistribuicaoMerendaDTO resumoMerenda = new ResumoDistribuicaoMerendaDTO();
                resumoMerenda.setDescricaoAlimento(result.get(0).toString());
                resumoMerenda.setItens(Integer.valueOf(result.get(1).toString()));
                resumoMerenda
                        .setQuantidade(result.get(2) == null ? new Long(0) : Long.parseLong(result.get(2).toString()));
                resumoMerenda.setValor(result.get(3) == null ? new BigDecimal(0)
                        : BigDecimal.valueOf(Double.parseDouble(result.get(3).toString())));
                listaRetorno.add(resumoMerenda);
            }

和例外:

java.lang.illegalargumentException:org.hibernate.hql.internal.ast.asteryntaxexception:意外令牌: *靠近第1行,第9列,第9列[select * select * select * select * select * select * select * select * from myProcedure(:ano,:mes,:mes,:mes,:codnre,:codnre,0:codnre,:(作为f(descricao varchar,itens Integer,Quantidade bigint,Valor Numeric(]

我已经尝试替换 *为f,但不工作=

您不能在createQuery()中使用PostgreSQL的SQL。createQuery命令仅接受Java持久性查询语言(JPQL(,该语言不知道数据库中定义的myprocedure

您要么必须使用em.createNativeQuery(...)(在此处查看文档(,要么使用此类内容

最新更新