使用多个IN OUT参数和注释

时间:2016-12-14 14:18:15

标签: 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);

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

String idTipoNombramiento;
String validar;
String mensaje;
String fechaPosesion;
String tipoIdentificacion;
String numeroIdentificacion;
String idEt;
//Getters and setters...

我有一个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();
    }

}

我尝试过很多东西,但是我无法获得一个参数为OUT的对象。

2 个答案:

答案 0 :(得分:5)

不要将带有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);

OUT参数写在传递给mapper方法的datosDocente参数中。它带有IN参数,是OUT参数的目标。

答案 1 :(得分:1)

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

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

其他变化。

 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();
    }

}

我正在重用我的对象datosDocente,当我调用方法“obtenerFechaPosesionIdNombramiento”时,他会自动保存对象中的参数。 现在一切顺利。我遵循了blackwizard的建议,我把这个方法放在了mapper中。