hibernate - JPA Hibernate 调用 Postgres 函数无效返回映射异常 :

标签 hibernate function jpa stored-procedures postgresql-9.1

我有一个问题,我得到一个: org.hibernate.MappingException: No Dialect mapping for JDBC type: 1111 当尝试使用 JPA 创建 native 查询调用 postgres 函数时。

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

  • 如果我使用 PgAdmin 查询工具 (select 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;
    

    最佳答案

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

    SELECT count(*) FROM your_function();
    

    现在它返回一个正确的整数,hibernate 很高兴。

    关于hibernate - JPA Hibernate 调用 Postgres 函数无效返回映射异常 :,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12557957/

    相关文章:

    java - Multi-Tenancy 应用程序 Java Spring Hibernate Mysql OAuth2 Spring Security

    c - 二维数组作为函数参数

    hibernate JPA : How to control "Not-Found" behavior when lazy loading a ManyToOne relation?

    java - QueryDsl - 对关联实体的多个字段进行 JPA 查询

    java - 具有复合主键的 JPA 存储库/服务设计

    java - Hibernate双向多对多级联困惑

    hibernate - 使用 hibernate 删除多对一

    c++ - 在我为我的二维 vector 赋予第一个值后控制台关闭

    php - 将数组转换为 Ul-Li

    java - Hibernate Struts 项目的项目结构?