使用多个IN OUT参数和注释在MyBatis中调用存储过程

All*_*anh 2 java oracle stored-procedures mybatis

我在Oracle中调用一个存储过程,接收7个参数并返回5,我只对两个参数感兴趣.这是我的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);
Run Code Online (Sandbox Code Playgroud)

我的CPDatosDocente是一个包含我需要的所有变量的POJO.

String idTipoNombramiento;
String validar;
String mensaje;
String fechaPosesion;
String tipoIdentificacion;
String numeroIdentificacion;
String idEt;
//Getters and setters...
Run Code Online (Sandbox Code Playgroud)

我有一个dao,我在调用MyBatis Sentence,但是当我调用procedure时,我的对象(CPDatosDocente)为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();
    }

}
Run Code Online (Sandbox Code Playgroud)

我已经尝试了很多东西,但是我无法获得具有所需参数OUT的对象.

bla*_*ard 6

不要将带有Out参数的过程调用视为选择.

mapper方法必须返回void,忘记@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);
Run Code Online (Sandbox Code Playgroud)

OUT参数写入datosDocente传递给mapper方法的参数中.它携带IN参数,是OUT参数的目标.


All*_*anh 1

我可以删除“datosDocente”并使用“datos”来解决这个问题,所以我做了一些更改。

\n\n
Mapper.java:\n\n@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})}")\n@Options(statementType = StatementType.CALLABLE)\n@ResultType(CPDatosDocente.class)\nvoid obtenerDatosFechaPosesionIdNombramiento(CPDatosDocente datosDocente);\n //I put this field void because I don\'t need this method return nothing.\n\nDAO.java\n
Run Code Online (Sandbox Code Playgroud)\n\n

其他变化。

\n\n
 public CPDatosDocente obtenerFechaPosesionIdNombramiento(String tipoIdentificacion,\n        String numeroIdentificacionDocente) {\n    SqlSession session = sf.openSession();\n    try {\n        // Se abre conexi\xc3\xb3n con el mapper\n        CPDatosDocenteMapper mapper = session.getMapper(CPDatosDocenteMapper.class);\n        // Se ejecuta la consulta para obtener la fecha de posesi\xc3\xb3n y el\n        // tipo de nombramiento\n        CPDatosDocente datosDocente = new CPDatosDocente();\n        //Se setean los par\xc3\xa1metros necesarios para ejecutar el procedimiento\n        datosDocente.setTipoIdentificacion(tipoIdentificacion);\n        datosDocente.setNumeroIdentificacion(numeroIdentificacionDocente);          \n        mapper.obtenerDatosFechaPosesionIdNombramiento(datosDocente);\n        return datosDocente;\n    } finally {\n        session.close();\n    }\n\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

我正在重用我的对象 datosDocente,当我调用方法“obtenerFechaPosesionIdNombramiento”时,他会自动保存对象中的参数。\n现在一切正常。我听从了blackwizard的建议,并将该方法置于mapper中。

\n