2016-04-25 11 views
0

Ich versuche, eine gespeicherte Prozedur auf einer PostgreSQL-Datenbank aufzurufen. Die Prozedur behandelt das Einfügen, Aktualisieren und Löschen von Tabelleneinträgen und akzeptiert daher Parameter. Einige der Parameter sind manchmal null, abhängig von der Art der Operation, die Sie ausführen möchten. Ich konnte den Proc mit Hibernate's SessionFactory aufrufen, aber jetzt möchte ich den JPA EntityManager verwenden. Das Verfahren Session ist wie folgt: eine für Java, eine für Postgres:Aufruf eines PostgreSQL-Prozesses mit EntityManager

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(); 
} 

Wie Sie sehen können, habe ich den Typ des Feldes zweimal angeben. Wenn ich jetzt mit dem EntityManager dasselbe mache, gibt es keine setParameter-Methode, die LongType.INSTANCE als Argument akzeptiert. Gibt es einen Workaround dafür?

EDIT: Suchen Sie auch nach einer Möglichkeit, dies mit jdbcTemplate zu tun. Versucht, diesen Weg zu gehen: https://docs.spring.io/spring/docs/current/spring-framework-reference/html/jdbc.html#jdbc-simple-jdbc-call-1, aber eine NullPointerException auf der .execute (in) -Zeile bekommen.

Antwort

0

Möglicherweise sollten Sie EntityManager.createStoredProcedureQuery verwenden. Auf diese Weise können Sie Typ für Parameter, zum Beispiel ein:

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(); 

I verwendet EntityManager.createStoredProcedureQuery für Oracle sein kann, ist es Ihnen helfen.

+0

Danke für die Antwort. Ich werde es versuchen und zu dir zurückkommen. – Burs

+0

Nun sagt die db, dass ich keinen Parameter an die Funktion übergeben habe. Ich habe es bestanden und es war null. – Burs

+0

Sprechen Sie über 5 Parameter? In meiner Antwort ist es null. – HAYMbl4

Verwandte Themen