【问题标题】:Call Procedure / Function JPA Hibernate调用过程/函数 JPA Hibernate
【发布时间】:2026-02-10 10:40:01
【问题描述】:

大家好,我在 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.QuerySyntaxException: 意外令牌: * 靠近第 1 行,第 9 列 [ SELECT * FROM myprocedure( :ano , :mes , :codNre , :codMun , 0 ) AS f(descricao varchar, itens integer, quantidade bigint, valor numeric) ]

我已经尝试将 * 替换为 f 但不起作用 =\

【问题讨论】:

标签: java postgresql hibernate jpa procedure


【解决方案1】:

您不能在createQuery() 中使用 PostgreSQL 的 SQL。 createQuery 命令只接受 Java Persistence Query Language (JPQL),它不知道您的数据库中定义的 myprocedure

您要么必须为此使用em.createNativeQuery(...)(查看文档here),要么使用this之类的东西

【讨论】: