Stored procedures en Spring

311 views
Skip to first unread message

Adrián E. Córdoba

unread,
Jun 10, 2010, 3:45:04 PM6/10/10
to JavaSOS
Hola Lista!
Necesito ejecutar un stored procedure a través de Spring, al cual le
tengo que pasar un Map con los parámetros que recibe, y debo obtener
un entero.
He probado algunas formas que he encontrado en Google, pero no pude
hacer funcionar a ninguna.
Soy nuevo en Spring, por lo que agradezco detalles.

Desde ya, agradecido.

Jorge Medina

unread,
Jun 10, 2010, 4:19:17 PM6/10/10
to jav...@googlegroups.com
Hmmm...¿que componente de Spring se connecta a la base de datos?

2010/6/10 Adrián E. Córdoba <software.asia@gmail.com>

--
www.JavaSOS.com
Grupo de colaboración Java/J2ee para desarrolladores de habla hispana.

Adrián E. Córdoba

unread,
Jun 10, 2010, 4:37:34 PM6/10/10
to JavaSOS
No sé muy bien a que te referís con componente.
Pero el siguiente método funciona:

////////////////////////////////////////////////////////////////////////
public ArrayList<?> executeSQL(String queryName, HashMap<?, ?> hm,
Class beanClass ){
JdbcTemplate jdbcTemplate = this.getJdbcTemplate();
jdbcTemplate.setResultsMapCaseInsensitive(true);
SimpleJdbcCall procReadAllActors =
new SimpleJdbcCall(jdbcTemplate)
.withProcedureName(queryName)
.returningResultSet(beanClass.getName(),
ParameterizedBeanPropertyRowMapper.newInstance(beanClass));
Map m = procReadAllActors.execute((Map<String, Object>) hm);
return (ArrayList<?>) m.get(beanClass.getName());
}
//////////////////////////////////////////////////////////////////////

Este método devuelve una List<beanClass>.
Yo necesito algo parecido, pero que devuelva un Integer.
Gracias por responder!


On 10 jun, 17:19, Jorge Medina <cerebrotecnolog...@gmail.com> wrote:
> Hmmm...¿que componente de Spring se connecta a la base de datos?
>
> 2010/6/10 Adrián E. Córdoba <software.a...@gmail.com>

Adrián E. Córdoba

unread,
Jun 11, 2010, 10:25:36 AM6/11/10
to JavaSOS
Lista: Ya encontré la forma para devolver un entero desde un SP a
través de Spring.
Aquí va el código, por si le interesa a alguien:

//////////////////////////////////////////////////////////////////////////////////////////

public int executeSQL(String queryName, HashMap<?, ?> hm){
ArrayList<?> mapAL =null;
SqlParameterSource mapIn = null;
SimpleJdbcCall sjc= new SimpleJdbcCall(this.getJdbcTemplate());
sjc.setProcedureName(queryName);
mapIn = (new MapSqlParameterSource()).addValues(hm);
mapAL =((ArrayList<?>) (sjc.execute(mapIn)).get("#result-set-1"));
Map<String, Object> map = (Map<String, Object>) mapAL..get(0);
Integer result = (Integer)(map.values().toArray())
[0];
return result;
}

//////////////////////////////////////////////////////////////////////////////////////////////

Gracias, de todas formas.
Saludos.

Gwath

unread,
Jun 17, 2010, 3:37:34 AM6/17/10
to JavaSOS
Holas, ya sé que ya tienes resuelta la duda, pero os mando como he
hecho una llamada a un SP con parámetros de entrada y salida. Supongo
que si se quisiera usar un map para pasar los parámetros se podría
usar NamedParameterJdbcTemplate.

//////////////////////////////////////////////////////////////////////////////////////////////////////////
public ReportRequest getDBRequest(final Integer idRequest) {
log.debug("Inicio obtener DBRequest");

ReportRequest execute = (ReportRequest) jdbcTemplate.execute(
new CallableStatementCreator() {

@Override
public CallableStatement createCallableStatement(final Connection
con)
throws SQLException {
final CallableStatement cs = con.prepareCall("{call
Pkg_reports.pr_getrequestinfo(?,?,?,?,?,?,?)}");
cs.setInt(1, idRequest);
cs.registerOutParameter(2, Types.INTEGER);
cs.registerOutParameter(3, Types.INTEGER);
cs.registerOutParameter(4, Types.INTEGER);
cs.registerOutParameter(5, Types.VARCHAR);
cs.registerOutParameter(6, Types.DATE);
cs.registerOutParameter(7, Types.VARCHAR);
return cs;
}
},

new CallableStatementCallback<ReportRequest>() {
public ReportRequest doInCallableStatement(final
CallableStatement cs) {
ReportRequest rr = null;
try {
cs.execute();
if (cs.getString(7) == null) {
rr = new ReportRequest();
rr.setReport_request_id(idRequest);
rr.setUser_id(cs.getInt(2));
rr.setReport_id(cs.getInt(3));
rr.setReport_type(cs.getInt(4));
rr.setIp_adress(cs.getString(5));
rr.setRequest_date(cs.getTimestamp(6));
}
} catch (final SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

return rr;
}
}
);

log.debug("Fin obtener DBRequest");
return execute;

////////////////////////////////////////////////////////////////////////////////////

Saludos.

Adrián E. Córdoba

unread,
Jun 19, 2010, 9:11:55 AM6/19/10
to JavaSOS
Gracias!
Reply all
Reply to author
Forward
0 new messages