代码之家  ›  专栏  ›  技术社区  ›  user1089362

MyBatis多个结果集和过程

  •  0
  • user1089362  · 技术社区  · 6 年前

    我尝试了以下映射:

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

    但我有个错误:

    组织。阿帕奇。伊巴蒂斯。例外情况。TooManyResultsException:selectOne()应返回一个结果(或null),但找到了:2

    我的界面是: Map<String, Object> getRequestDetail(RequestDetailRequest detailRequest);

    您能帮助我如何用调用过程映射多个ResultSet吗? 我的数据库是Sybase。

    2 回复  |  直到 6 年前
        1
  •  1
  •   shanahobo86    6 年前

    sqlSession。selectOne表示您只希望从过程返回一行。

    相反,您应该使用sqlSession。选择

        2
  •  0
  •   Pie Lee    5 年前

    名为的方法 getRequestDetail 必须将返回类型更改为 List<List<?>> 而不是 Map<String, Object>

    然后,您可以获得列表的结果类型。 它包含类型 ExternalManagersMap 在索引0中作为列表和类型 SubjectServicesMap 在索引1中作为列表。

    所以,你可以这样写。

    List<List> result = getRequestDetail(RequestDetailRequest detailRequest);
    ExternalManagersMap external = (ExternalManagersMap) result.get(0);
    SubjectServicesMap subject = (SubjectServicesMap) result.get(1);