【问题标题】:Calling a PostgreSQL Proc using EntityManager使用 EntityManager 调用 PostgreSQL Proc
【发布时间】:2016-04-25 09:01:06
【问题描述】:

我正在尝试在 PostgreSQL 数据库上调用存储过程。该过程处理插入、更新和删除表条目,因此它接受参数。某些参数有时为空,具体取决于您要执行的操作类型。我能够使用 Hibernate 的 SessionFactory 调用 proc,但现在我想使用 JPA EntityManager。使用SessionFactory的过程如下:

public Result callFunction(String type_proc, String node, String fullcode, Date bdate){
    Session session = this.sessionFactory.getCurrentSession();

    org.hibernate.Query query = session.createSQLQuery(
            "SELECT*FROM public.someFunction(:type_proc, :node, :fullcode, :bdate, CAST(:cat_id AS BIGINT)")
            .addEntity(Result.class)
            .setParameter("type_proc", type_proc)
            .setParameter("node", node)
            .setParameter("fullcode", fullcode)
            .setParameter("bdate", bdate)
            .setParameter("cat_id", null, LongType.INSTANCE)

    return (Result) query.uniqueResult();
}

如您所见,我指定了两次字段的类型:一次用于 Java,一次用于 Postgres。现在,如果我使用 EntityManager 执行相同操作,则没有 setParameter 方法接受 LongType.INSTANCE 作为参数。有什么解决办法吗?

编辑:也在寻找一种使用 jdbcTemplate 的方法。尝试这样做:https://docs.spring.io/spring/docs/current/spring-framework-reference/html/jdbc.html#jdbc-simple-jdbc-call-1,但在 .execute(in) 行上出现 NullPointerException。

【问题讨论】:

    标签: java hibernate postgresql jpa stored-procedures


    【解决方案1】:

    也许你应该使用EntityManager.createStoredProcedureQuery。这样就可以设置参数的类型,例如:

        private final static String STORED_PROCEDURE = "public.someFunction";
    
        StoredProcedureQuery query = em.createStoredProcedureQuery(STORED_PROCEDURE);
        query.
                registerStoredProcedureParameter(1, String.class, ParameterMode.IN).setParameter(1, type_proc).
                registerStoredProcedureParameter(2, String.class, ParameterMode.IN).setParameter(2, node).
                registerStoredProcedureParameter(3, String.class, ParameterMode.IN).setParameter(3, fullcode).
                registerStoredProcedureParameter(4, Date.class, ParameterMode.IN).setParameter(4, bdate).
                registerStoredProcedureParameter(5, LongType.INSTANCE, ParameterMode.IN).setParameter(5, null).
                execute();
    

    我在 Oracle 上使用了 EntityManager.createStoredProcedureQuery 可能对你有帮助。

    【讨论】:

    • 感谢您的回答。我会尝试并回复你。
    • 现在数据库说我没有将参数传递给函数。我确实通过了它,它是空的。
    • 你说的是5参数吗?在我的回答中它是空的。
    • 是的,我传了,数据库不识别为传参数。您知道在传递参数之前转换参数的方法吗?就像我对会话工厂所做的那样:CAST(:cat_id AS BIGINT)
    • 为什么不能将参数转换成java代码?例如将LongType.INSTANCE 更改为Integer.classNumber.class。如果你知道你放了整数参数。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-29
    • 2015-05-26
    • 2012-05-24
    相关资源
    最近更新 更多