Mybatis не удалось установить параметр OUT при выполнении хранимой процедуры - PullRequest
0 голосов
/ 23 марта 2020

Я следую на этот вопрос , чтобы вызвать хранимую процедуру с 1 входным параметром и 1 выходным параметром:

Mapper:

package myapp.test.persistence;

import myapp.test.ExpectationProcessMessage;
import org.apache.ibatis.annotations.*;

import java.util.List;
import java.util.Map;

@Mapper
public interface ExpectationProcessMessageMapper {
    List<ExpectationProcessMessage> processExpectation(Map<String, Object> params);
}

XML содержимое:

<mapper namespace="myapp.test.persistence.ExpectationProcessMessageMapper">

    <resultMap id="expectationProcessMessages" type="myapp.test.ExpectationProcessMessage">
        <id property="errorCode" column="error_code"/>
        <result property="errorMessage" column="error_message"/>
    </resultMap>

    <select id="processExpectation" parameterType="java.util.HashMap" resultMap="expectationProcessMessages">
      {call cp_process_expectation_api (#{ai_expectation_id,jdbcType=NUMERIC, javaType=java.lang.Integer,mode=IN},
                                         #{ac_process_flag,jdbcType=VARCHAR, javaType=java.lang.String,mode=OUT})}
    </select>
</mapper>

Класс вызова:

package myapp.test.persistence;

@Repository
public class SqlExpectationRepositoryImpl implements ExpectationRepository {
    ...
    @Override
    public ExpectationProcess processExpectation(Integer expectationId) {
        Map<String, Object> params = new HashMap<String, Object>();
        params.put("ai_expectation_id", expectationId);
        params.put("ac_process_flag", null);
        List<ExpectationProcessMessage> expectationProcessMessages = expectationProcessMessageMapper.processExpectation(params);
        System.out.println(params.get("ac_process_flag"));
    }
    ...
}

Определение хранимой процедуры:

begin
    declare @ai_expectation_id int = 0
    declare @ac_process_flag char
    declare @result int
    exec
        @result = cp_process_expectation_api
            @ai_expectation_id,
            @ac_process_flag output

    select @ac_process_flag

    select @result as result
end

Но я получил исключение:

Причина : com.microsoft.sqlserver.jdb c .SQLServerException: значение не задано для параметра с номером 2.
Без категории SQLException; SQL состояние [ноль]; код ошибки [0]; Значение не установлено для параметра № 2 .; вложенное исключение: com.microsoft.sqlserver.jdb c .SQLServerException: значение не задано для параметра с номером 2.

1 Ответ

0 голосов
/ 23 марта 2020

Я нашел решение. Нам нужно добавить свойство StatementType = "CALLABLE" в файл XML. Это будет так:

<mapper namespace="com.gbst.processmanagement.infra.persistence.expectation.expectation.ExpectationProcessMessageMapper">

    <resultMap id="expectationProcessMessages" type="com.gbst.processmanagement.domain.expectation.expectation.ExpectationProcessMessage">
        <id property="errorCode" column="error_code"/>
        <id property="messageType" column="message_type"/>
        <result property="errorPointer" column="error_pointer"/>
        <result property="errorMessage" column="error_message"/>
    </resultMap>

    <select id="processExpectation" statementType="CALLABLE" parameterType="java.util.HashMap" resultMap="expectationProcessMessages">
      {call cp_process_expectation_api (#{expectationId,jdbcType=NUMERIC, javaType=java.lang.Integer,mode=IN},
                                        #{processFlag,jdbcType=VARCHAR, javaType=java.lang.String,mode=OUT})}
    </select>
</mapper>


...