2016-04-25 4 views
0

PostgreSQLデータベースでストアドプロシージャを呼び出そうとしています。このプロシージャは、表エントリの挿入、更新および削除を処理するため、paramsを受け入れます。実行したい操作の種類に応じて、パラメタの一部がnullになることがあります。私はHibernateのSessionFactoryを使ってprocを呼び出すことができましたが、今はJPA EntityManagerを使いたいと思います。次のようにのSessionFactoryを使用して手順は次のとおりです。EntityManagerを使用してPostgreSQL Procを呼び出す

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のための1対1に。これで、EntityManagerを使用して同じことを行うと、LongType.INSTANCEを引数として受け入れるsetParameterメソッドはありません。この問題を回避する方法はありますか?

EDIT:jdbcTemplateを使用してこれを行う方法も探しています。この方法を試してみます:https://docs.spring.io/spring/docs/current/spring-framework-reference/html/jdbc.html#jdbc-simple-jdbc-call-1が、.execute(in)行にNullPointerExceptionがあります。

答えて

0

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を使用しました。

+0

答えをありがとう。私はそれを試し、あなたに戻ってきます。 – Burs

+0

ここでdbは、関数にパラメータを渡していないと言っています。私はそれを渡し、それはnullだった。 – Burs

+0

あなたは約5パラメータを話していますか?私の答えでは、それはnullです。 – HAYMbl4

関連する問題