2011-12-24 22 views
5

Estoy tratando de diseñar una pequeña herramienta CRUD, y hasta ahora cada faceta (la interfaz de usuario Rich Faces y Beans gestionados, , la base de datos mySQL, etc.) bien, pero no la pieza myBatis.MyBatis mapper para llamar a PROC con múltiples parámetros IN

soy relativamente nuevo en mybatis y estoy manteniendo la guía del usuario y API a mano, pero hay todavía hay algunas cosas que simplemente no va unido a mí, y uno es cualquier llamada a un procedimiento que implica múltiples parámetros IN. Aquí está un ejemplo:

Este de la BD establecer scripts:

create procedure MY_FOO_PROC (IN valA VARCHAR(15), IN valB CHAR(1)) 
    begin 
     select blah from blah where blah = valA and blah = valB etc.; 
    end 

Este desde MyMapper.java:

public interface MyMapper { 
List<MyFooClass> getProgress (
     @Param("valA") String valueA, @Param("valB") String valueB); 
} 

Este desde MyMapper.xml:

<select id="getProgress" parameterType="map" 
    resultMap="MyFooMap" statementType="CALLABLE"> 
    { call MY_FOO_PROC (
     #{valA, mode=IN, jdbcType=VARCHAR} 
     #{valB, mode=IN, jdbcType=CHAR} 
    )} 
</select> 

Y finalmente esto de mi clase DAO:

public static List<MyFooClass> 
     doGetProgress (String valueA, String valueB) { 
    SqlSession session = MyBatisConnectionFactory.getInstance().getSqlSessionFactory().openSession(); 
    EsparMapper mapper = session.getMapper(MyMapper.class); 
    List<MyFooClass> listFoo = mapper.getProgress(valueA, valueB); // line which originates exception below 
    session.close(); 
    return listFoo; 
} 

El resultado:

### Error querying database. Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Incorrect number of arguments for PROCEDURE dbname.MY_FOO_PROC; expected 2, got 1 
### The error may involve my.package.names.getProgress-Inline 
### The error occurred while setting parameters 

que se tenga en cuenta que también he intentado:

  1. creación de un POJO con variables Vala y Valb y getters/setters para cada uno,
  2. decisiones parameterType="PojoClass" en el XML,
  3. omitiendo el session.getMapper() y creando una instancia de PojoClass,
  4. y llamando session.selectList("getProgress", pojoInstance);

con el resultado casi idéntico (es decir, número incorrecto de argumentos).

Muy poca ayuda en la búsqueda en la red, la mayoría me dice que haga lo que creo que ya he hecho.

Respuesta

4

Creo que le falta una coma en la llamada al procedimiento.

<select id="getProgress" parameterType="map" 
    resultMap="MyFooMap" statementType="CALLABLE"> 
    { call MY_FOO_PROC (
     #{valA, mode=IN, jdbcType=VARCHAR} , --<--- this 
     #{valB, mode=IN, jdbcType=CHAR} 
)} 
</select> 
+2

Los errores simples como este son los más frustrantes. ¡Gracias y Feliz Navidad! – cobaltduck

Cuestiones relacionadas