I'm calling a stored procedure in Oracle who receive 7 parameters and return 5, I'm just interested in two parameters. This is me MyBatis Select
@Select(value = "{CALL prc_ultimo_nombramiento(" +
"#{tipoIdentificacion, mode=IN}," +
"#{numeroIdentificacion, mode=IN}," +
"#{idEt, jdbcType=VARCHAR}," +
"#{fechaPosesion, mode=OUT, jdbcType=VARCHAR}," +
"#{idTipoNombramiento, mode=OUT, jdbcType=VARCHAR}," +
"#{validar, jdbcType=VARCHAR}," +
"#{mensaje, jdbcType=VARCHAR}" +
")}")
@Options(statementType = StatementType.CALLABLE)
@ResultType(CPDatosDocente.class)
CPDatosDocente obtenerDatosFechaPosesionIdNombramiento(CPDatosDocente datosDocente);
My CPDatosDocente is a POJO who contains all variables I need so.
String idTipoNombramiento;
String validar;
String mensaje;
String fechaPosesion;
String tipoIdentificacion;
String numeroIdentificacion;
String idEt;
//Getters and setters...
I have a dao where I'm calling MyBatis Sentence, but when I call procedure, my object(CPDatosDocente) is null
public CPDatosDocente obtenerFechaPosesionIdNombramiento(Long tipoIdentificacion,
Long numeroIdentificacionDocente) {
SqlSession session = sf.openSession();
try {
// Se abre conexión con el mapper
CPDatosDocenteMapper mapper = session.getMapper(CPDatosDocenteMapper.class);
// Se ejecuta la consulta para obtener la fecha de posesión y el
// tipo de nombramiento
CPDatosDocente datos = new CPDatosDocente();
datos.setTipoIdentificacion(tipoIdentificacion);
datos.setNumeroIdentificacion(numeroIdentificacionDocente);
CPDatosDocente datosDocente = mapper.obtenerDatosFechaPosesionIdNombramiento(datos);
System.out.println(datosDocente.getFechaPosesion());
return datosDocente;
} finally {
session.close();
}
}
I have tried a lot of things, but I have couldn't obtain a object with parameters OUT that I need.
Do not consider a Procedure call with Out parameter as a select.
You mapper method must return void, forget the @ResultType.
@Select(value = "{CALL prc_ultimo_nombramiento(" +
"#{tipoIdentificacion, mode=IN}," +
"#{numeroIdentificacion, mode=IN}," +
"#{idEt, jdbcType=VARCHAR}," +
"#{fechaPosesion, mode=OUT, jdbcType=VARCHAR}," +
"#{idTipoNombramiento, mode=OUT, jdbcType=VARCHAR}," +
"#{validar, jdbcType=VARCHAR}," +
"#{mensaje, jdbcType=VARCHAR}" +
")}")
@Options(statementType = StatementType.CALLABLE)
void obtenerDatosFechaPosesionIdNombramiento(CPDatosDocente datosDocente);
The OUT parameters are written in datosDocente
parameter passed to the mapper method. It carries the IN parameters and is a target for OUT parameters.
I could solve this problem deleting "datosDocente and using "datos" so I did some changes.
Mapper.java:
@Select(value = "{CALL prc_ultimo_nombramiento(#{tipoIdentificacion, mode=IN},#{numeroIdentificacion, mode=IN},#{idEt, jdbcType=VARCHAR},#{fechaPosesion, mode=OUT, jdbcType=VARCHAR},#{idTipoNombramiento, mode=OUT, jdbcType=VARCHAR},#{validar, jdbcType=VARCHAR},#{mensaje, jdbcType=VARCHAR})}")
@Options(statementType = StatementType.CALLABLE)
@ResultType(CPDatosDocente.class)
void obtenerDatosFechaPosesionIdNombramiento(CPDatosDocente datosDocente);
//I put this field void because I don't need this method return nothing.
DAO.java
Other changes.
public CPDatosDocente obtenerFechaPosesionIdNombramiento(String tipoIdentificacion,
String numeroIdentificacionDocente) {
SqlSession session = sf.openSession();
try {
// Se abre conexión con el mapper
CPDatosDocenteMapper mapper = session.getMapper(CPDatosDocenteMapper.class);
// Se ejecuta la consulta para obtener la fecha de posesión y el
// tipo de nombramiento
CPDatosDocente datosDocente = new CPDatosDocente();
//Se setean los parámetros necesarios para ejecutar el procedimiento
datosDocente.setTipoIdentificacion(tipoIdentificacion);
datosDocente.setNumeroIdentificacion(numeroIdentificacionDocente);
mapper.obtenerDatosFechaPosesionIdNombramiento(datosDocente);
return datosDocente;
} finally {
session.close();
}
}
I'm reusing my object datosDocente and when I call method "obtenerFechaPosesionIdNombramiento" He automatically save out parameters in the object. Now all works well. I followed the advice from blackwizard and I put void the method in mapper.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With