我遇到一个问题:org.hibernate.MappingException:JDBC类型的No Dialect映射:1111尝试使用JPA创建 native 查询时调用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;
    

    最佳答案

    这可能是一个hack,但是对我有用,非常简单。只需将查询更改为:

    SELECT count(*) FROM your_function();
    

    现在,它返回一个适当的整数,并且 hibernate 状态很高兴。

    10-07 19:04
    查看更多