有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java使用EntityManager调用PostgreSQL过程

我正在尝试调用PostgreSQL数据库上的存储过程。该过程处理插入、更新和删除表项,因此它接受参数。某些参数有时为null,具体取决于要执行的操作类型。我可以使用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执行相同的操作,则没有接受LongType的setParameter方法。实例作为参数。有什么解决办法吗

编辑:也在寻找一种使用jdbcTemplate实现这一点的方法。尝试这样做:https://docs.spring.io/spring/docs/current/spring-framework-reference/html/jdbc.html#jdbc-simple-jdbc-call-1,但在上得到了NullPointerException。按行执行


共 (1) 个答案

  1. # 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();
    

    我用了EntityManager.createStoredProcedureQueryfor Oracle可能对你有帮助