Я пробовал следующее сопоставление:

<select id="getRequestDetail" statementType="CALLABLE" parameterType="test.domain.RequestDetailRequest" resultMap="ExternalManagersMap, SubjectServicesMap">
    {call pop.dbo.getRequestDetail ( #{uid, mode=IN, jdbcType=VARCHAR},
                            #{requestId, mode=IN, jdbcType=INTEGER},
                            #{resultStatus, mode=OUT, jdbcType=INTEGER},
                            #{resultMsg, mode=OUT, jdbcType=VARCHAR} )}
</select>


<resultMap type='test.domain.User' id="ExternalManagersMap">
        <result property="name" column="externalManager"/>
</resultMap>

<resultMap type='test.domain.Service' id="SubjectServicesMap">
        <result property="name" column="serviceName"/>
        <result property="id" column="serviceId"/>
</resultMap>

Но у меня ошибка:

org.apache.ibatis.exceptions.TooManyResultsException: ожидалось, что один результат (или ноль) будет возвращен selectOne (), но найдено: 2

Мой интерфейс: Map<String, Object> getRequestDetail(RequestDetailRequest detailRequest);

Не могли бы вы помочь мне, как сопоставить несколько наборов результатов с вызывающей процедурой? Моя БД - Sybase.

0
user1089362 14 Мар 2018 в 14:24

2 ответа

Лучший ответ

SqlSession.selectOne указывает, что вы ожидаете только одну строку, возвращаемую из процедуры.

Вместо этого вы должны использовать sqlSession.select

1
shanahobo86 25 Окт 2018 в 10:44

Метод с именем getRequestDetail необходимо изменить возвращаемый тип на List<List<?>> вместо Map<String, Object>.

И тогда вы можете получить тип результата List. Он содержит тип ExternalManagersMap в индексе 0 как список и тип SubjectServicesMap в индексе 1 как список.

Итак, вы можете писать так.

List<List> result = getRequestDetail(RequestDetailRequest detailRequest);
ExternalManagersMap external = (ExternalManagersMap) result.get(0);
SubjectServicesMap subject = (SubjectServicesMap) result.get(1);
0
Maple Lee 21 Янв 2020 в 07:50