MyBatis Mapper для вызова PROC с несколькими параметрами IN - PullRequest
5 голосов
/ 25 декабря 2011

Я пытаюсь разработать небольшой инструмент CRUD, и пока что каждый аспект (пользовательский интерфейс Rich Faces и Managed Beans, проверка, база данных mySQL и т. д.) идет нормально, но не часть myBatis.

Я относительно новичок в myBatis и держу руководство пользователя и API под рукой, но есть Есть еще некоторые вещи, которые просто не могут собраться вместе для меня, и один из них - любой вызов процедуры с участием нескольких параметров IN. Вот пример:

Это из БД настроить скрипты:

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 

Это из MyMapper.java:

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

Это из 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>

И, наконец, это из моего класса 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;
}

Результат:

### 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

Замечу, что я тоже пробовал:

  1. создание POJO с переменными valA и valB и геттерами / сеттерами для каждый,
  2. делает parameterType="PojoClass" в XML,
  3. пропуск session.getMapper() и создание экземпляра PojoClass,
  4. и звонит session.selectList("getProgress", pojoInstance);

с почти идентичным результатом (т. Е. Неверное количество аргументов).

Очень мало помощи по поиску в сети, большинство подсказывает мне сделать то, что, я думаю, я уже сделал.

1 Ответ

5 голосов
/ 25 декабря 2011

Я думаю, вы пропустили запятую в вызове процедуры.

<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>
...