Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Call stored procedure in MyBatis with multiples IN OUT parameters and annotations

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.

like image 944
Allanh Avatar asked Mar 11 '23 10:03

Allanh


2 Answers

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.

like image 177
blackwizard Avatar answered Mar 13 '23 00:03

blackwizard


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.

like image 43
Allanh Avatar answered Mar 12 '23 23:03

Allanh