当前位置: 首页 > 面试题库 >

JPA Hibernate调用Postgres函数无效返回MappingException:

缪英锐
2023-03-14
问题内容

我遇到一个问题: org.hibernate.MappingException:JDBC类型的No Dialect映射:1111
尝试使用JPA创建本机查询时调用postgres函数。

我在启动单例中创建了一个EJB计时器,以每6小时运行一次Postgres函数。该函数返回void并检查过期的记录,将其删除并更新某些状态。它不接受任何参数,并且返回void。

  • 如果我使用PgAdmin查询工具(选择function();)调用postgres函数,则该函数可以完美运行,并返回void。

  • 在Glassfish 3.1.1上部署应用程序时,出现异常和部署失败。

这是(缩短的)堆栈跟踪:

WARNING: A system exception occurred during an invocation on EJB UserQueryBean method public void com.mysoftwareco.entity.utility.UserQueryBean.runRequestCleanup()
javax.ejb.TransactionRolledbackLocalException: Exception thrown from bean
...STACK TRACE BLAH BLAH BLAH ...
Caused by: javax.persistence.PersistenceException: org.hibernate.MappingException: No Dialect mapping for JDBC type: 1111

这是代码:

首先是JPA的东西:

public void runRequestCleanup() {
    String queryString = "SELECT a_function_that_hibernate_chokes_on()";
    Query query = em.createNativeQuery(queryString);
    Object result = query.getSingleResult();
}

这是单例调用它:

@Startup
@Singleton
public class RequestCleanupTimer {
    @Resource
    TimerService timerService;
    @EJB
    UserQueryBean queryBean;

    @PostConstruct
    @Schedule(hour = "*/6")
    void runCleanupTimer() {
        queryBean.runRequestCleanup();
    }
}

和功能:

CREATE OR REPLACE FUNCTION a_function_that_hibernate_chokes_on()
  RETURNS void AS
$BODY$
    DECLARE 
        var_field_id myTable.field_id%TYPE;
    BEGIN
        FOR var_field_id IN
                select field_id from myTable 
                where status = 'some status'
                and disposition = 'some disposition'
                and valid_through < now()
        LOOP
            BEGIN
                -- Do Stuff
            END;
        END LOOP;
    END;
$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100;

问题答案:

我对JPA有足够的了解,试图使其运行存储过程。

我最终使用带准备好的语句的JDBC。在花了几个小时的徒劳尝试将方钉插入圆孔后,我在15分钟内做到了。我将持久性单元用来获取连接,创建准备好的语句并在完成后将其关闭的同一个jndi数据源称为。

因此,如果您需要从(现在主要是)JPA应用程序运行存储过程(或Postgres函数),这对我有用:

@Stateless
@LocalBean
public class UserQueryBean implements Serializable {

    @Resource(mappedName="jdbc/DatabasePool") 
    private javax.sql.DataSource ds;

    ...

    public void runRequestCleanup() {

        String queryString = "SELECT cleanup_function_that_hibernateJPA_choked_on()";
        Connection conn = null;
        PreparedStatement statement = null;
        try {
            conn = ds.getConnection();
            statement = conn.prepareCall(queryString);
            statement.executeQuery();
        } catch (SQLException ex) {
            Logger.getLogger(UserQueryBean.class.getName()).log(Level.SEVERE, null, ex);
        }finally{
            try {
                statement.close();
                conn.close();
            } catch (SQLException ex) {
                Logger.getLogger(UserQueryBean.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
        // bit of logging code here    
    }
    ...
}

忽略JPA在服务器上运行函数或存储过程的简单功能似乎令人恐惧。特别是除了void或受影响的行数以外不返回任何内容的代码。如果是故意的……则无可奉告。

编辑:添加了关闭连接。



 类似资料:
  • 问题内容: 我正在使用Postgresql 8.3,并具有以下简单功能,该功能会将a返回 给客户端 现在,我可以使用以下SQL命令来调用此函数并操纵返回的游标,但是游标名称是由PostgreSQL自动生成的 此外,如38.7.3.5中所述,显式地将游标名称声明为函数的输入参数 。返回游标。我可以声明自己的游标名称并使用此游标名称来操纵返回的游标,而不是为我自动生成的Postgresql吗?如果不是

  • 这表示函数quarter()是在Hive1.3中引入的 https://cwiki.apache.org/confluence/display/hive/languageManual+udf#languageManualudf-datefunctions https://azure.microsoft.com/en-us/documentation/articles/hdinsight-compo

  • 问题内容: 在node.js Lambda函数和Alexa之间对API进行REST调用时遇到问题。我正在使用请求库来进行具有帐户关联技能的呼叫。我仅针对意图设置了一个示例话语,模拟器对此效果很好。 另外,cloudwatch日志显示了来自api端点的200响应代码以及从console.logs到CW的API返回的任何数据。 我猜这与我要求Alexa“发出/讲”的SpeechOutput格式有关?

  • 我找到了一些很好的SO链接(如何从异步回调函数返回值?以及从node.js中的回调函数返回值等),但它们并不是不能为我的问题提供解决方案。 我的问题:能够得到异步调用的结果,但我如何使用这个结果返回我的函数? 这里获取callBackResponse的值为true或false,并希望将该值用作:

  • 问题内容: 我刚刚学习(正在学习)函数参数在Python中的工作方式,并且在没有明显原因的情况下开始进行实验: 给出了输出: 哪里来的?还有,这是什么? 问题答案: 它是函数的返回值,您可以将其打印出来。如果没有语句(或者只是没有参数的),则将隐式添加到函数的末尾。 您可能想返回函数中的值,而不是打印它们:

  • 问题内容: 我试图在postgres函数内返回查询结果。我尝试了一下,并完美地工作了: 问题是我需要一些东西来返回以下结果: 我需要什么回报,或者应该改变什么才能实现这一目标? 问题答案: 这可以通过一个简单的SQL函数来完成: 可以在手册中找到更多详细信息和示例:http : //www.postgresql.org/docs/current/static/xfunc-sql.html#XFUN