martes, 20 de agosto de 2013

Ejecutar procedimiento almacenado en hibernate 4

De vez en cuando hay que ejecutar procedimiento almacenados en hibernate 4 he aqui un ejemplo, en realidad utiliza hibernate como la capa mas alta, al final lo ejecuta por jdbc, y esto es porque hibernate 4 solo ejecuta procedimientos almacenados de forma directa si estos devuelven datos en plan resultset, en caso contrario segun nos cuenta en su pagina se debe de utilizar por jdbc, que le llaman un "Work"

Ejemplo:

Params es una clase para encapsular lo datos entrada salida.

public void executeProcedimientoAlmacenado(final Params params) {
final StringBuilder sql = new StringBuilder("");
sql.append(" call esquema.nombre_procedimiento_almacenado(");
sql.append(" ?,");//IN_param_1
sql.append(" ?,");//IN_param_2
sql.append(" ?)");//OUT_param_1
getSession().doWork(new Work(){

public void execute(Connection connection) throws SQLException {
CallableStatement callStmt = connection.prepareCall(sql.toString());
int indexParam=1;
callStmt.setInt(indexParam++, params.getInParam_1());//1
    callStmt.setInt(indexParam++, params.getInParam_2() !=null ? params.getInParam_2() : Types.NULL);//2
callStmt.registerOutParameter(indexParam++, Types.INTEGER);//3
callStmt.executeUpdate();

params.setOutParam(callStmt.getInt(3)); //El parametro 3 es la salida, y lo pasamos al objecto params
}

});
}

Como se ve se utiliza "Work" que es una ejecución directa jdbc encampsulada por hibernate 4, y el objeto Params contiene los datos de entrada posterioremente se setean los de salida y así desde donde se llama el método el params contiene los resultados.

el getSession() es para obtener la session de hibernate, que se traduce también en sessionFactory.getSession() el sessionFactory es inyectado con Spring al Dao que ejecute los procedimientos almacenados, igual que cualquier otro dao.


No hay comentarios:

Publicar un comentario