2017-05-11 4 views

Antwort

0

Der Weg, den ich in der Vergangenheit erreicht habe, besteht darin, einem Spring Data JPA-Repository ein benutzerdefiniertes Verhalten hinzuzufügen (link). Innerhalb davon bekomme ich den EntityManager und benutze java.sql.Connection und CallableStatement

Edit: Hinzufügen von High-Level-Beispielcode. Probe macht die Annahme, dass Sie Hibernate verwenden, aber Idee sollte

anderen auch anwendbar Sie eine EntityRepository haben Angenommen

public interface EntityRepositoryCustom { 

    Result storedProcCall(Input input); 
} 

public class EntityRepositoryImpl implements EntityRepositoryCustom { 

    @PersistenceContext 
    private EntityManager em; 

    @Override 
    public Result storedProcCall(Input input) { 
     final Result result = new Result(); 
     Session session = getSession(); 
     // instead of anonymous class you could move this out to a private static class that implement org.hibernate.jdbc.Work 
     session.doWork(new Work() { 

      @Override 
      public void execute(Connection connection) throws SQLException { 
       CallableStatement cs = null; 
       try { 
        cs = connection.prepareCall("{call some_stored_proc(?, ?, ?, ?)}"); 
        cs.setString(1, ""); 
        cs.setString(2, ""); 
        cs.registerOutParameter(3, Types.VARCHAR); 
        cs.registerOutParameter(4, Types.VARCHAR); 
        cs.execute(); 

        // get value from output params and set fields on return object 
        result.setSomeField1(cs.getString(3)); 
        result.setSomeField2(cs.getString(4)); 
        cs.close(); 

       } finally { 
        // close cs 
       } 
      } 
     }); 
     return result; 
    } 

    private Session getSession() { 
     // get session from entitymanager. Assuming hibernate 
     return em.unwrap(org.hibernate.Session.class); 
    } 

}