2017-03-01 5 views
0

Mybatis로이 복합 오브젝트를 만들고 싶습니다.Mybatis 콜렉션 프로 시저 호출 매개 변수 없음

public class UserInfo { 
    public Integer clientId; 
    public String userName; 

    public List<Device> deviceList; 
} 

처음 두 필드 복귀 한 절차 :

procedure getUserInfo(pClientId in number, pRes out sys_refcursor); 

세 번째 필드 (deviceList) 다른 프로 시저를 반환 :

procedure getDevices(pClientId in number, pRes out sys_refcursor); 

내 자바 코드 :

SqlSession session = sqlSessionFactory.openSession(); 
mapper = session.getMapper(UserInfoMapper.class); 

Map<String, Object> params = new HashMap<String, Object>(); 
ResultSet rs = null; 
params.put("clientId", clientId); 
params.put("result", rs); 

mapper.getUserInfo(params); 

info = ((ArrayList<UserInfo>)params.get("result")).get(0); 

UserInfoMapper :

public interface UserInfoMapper { 
    void getUserInfo(Map<String, Object> params); 
} 

문제점을 해결하기 위해 어떻게 UserInfoMapper.xml을 작성해야합니까? 는 이제 다음과 같습니다

문제에 특히 관심이
<mapper namespace="UserInfoMapper"> 
    <resultMap id="UserInfoResult" type="UserInfo"> 
     <id property="clientId" column="clientId"/> 
     <result property="userName" column="userName"/> 
     <collection property="deviceList" ofType="Device" 
        column="clientId=clientId" select="getDeviceList"/> 
    </resultMap> 

    <resultMap id="DeviceListResult" type="Device"> 
     <result property="deviceName" column="DEVICE_NAME"/> 
    </resultMap> 

    <select id="getUserInfo" statementType="CALLABLE" parameterType="java.util.Map"> 
     CALL MESSAGE_SERVER.getUserInfo(
      #{clientId, mode=IN}, 
      #{result, jdbcType=CURSOR, javaType=java.sql.ResultSet, mode=OUT, resultMap=UserInfoResult}   
     ) 
    </select> 

    <select id="getDeviceList" statementType="CALLABLE" parameterType="java.util.Map" > 
     CALL MESSAGE_SERVER.getDevices(
      #{clientId, mode=IN}, 
      #{result, jdbcType=CURSOR, javaType=java.sql.ResultSet, mode=OUT, resultMap=DeviceListResult}   
     ) 
    </select> 

</mapper> 

: 컬렉션을 선택 결과에 어떻게 최종 목적에 도달? 이 객체 링크를 만드는 방법은 무엇입니까?

이제 처음 두 필드가 성공적으로 반환됩니다. 그러나 deviceList는 비어 있습니다.

+0

ResultSet의 선언을 잊어 버렸습니다. 이것은 구현 세부 사항이며, 단지'params.put ("result", null);과'result '키가 존재하지 않아도 될 수도 있습니다. ArrayList 대신 List 사용 : 선언 된 변수는 가능한 한 추상적이어야합니다. – blackwizard

답변

1

실제로 할당되지 않았기 때문에 장치 목록이 null입니다. 실제로 저장 프로 시저 호출은 결과를 반환하는 선택이 아니며 결과가 출력 변수에 바인딩되므로 잘 이해하고 'getUserInfo'에 적용합니다. 저장 프로 시저를 사용하는 경우 단일 매퍼 호출을 사용하여 수행 할 수 없습니다.

다음은 매퍼를 수정하는 방법입니다. 컬렉션/중첩 된 선택이 더 이상 없습니다.

deviceList 결과를 UserInfo 개체에 직접 바인딩 할 수 있습니다.이 개체는 매개 변수로 사용해야합니다.

<mapper namespace="UserInfoMapper"> 
    <resultMap id="UserInfoResult" type="UserInfo"> 
     <id property="clientId" column="clientId"/> 
     <result property="userName" column="userName"/> 
    </resultMap> 

    <resultMap id="DeviceListResult" type="Device"> 
     <result property="deviceName" column="DEVICE_NAME"/> 
    </resultMap> 

    <select id="getUserInfo" statementType="CALLABLE" parameterType="java.util.Map"> 
     CALL MESSAGE_SERVER.getUserInfo(
      #{clientId, mode=IN}, 
      #{result, jdbcType=CURSOR, javaType=java.sql.ResultSet, mode=OUT, resultMap=UserInfoResult}   
     ) 
    </select> 

    <select id="loadDeviceList" statementType="CALLABLE" parameterType="UserInfo" > 
     CALL MESSAGE_SERVER.getDevices(
      #{clientId, mode=IN}, 
      #{deviceList, jdbcType=CURSOR, javaType=java.sql.ResultSet, mode=OUT, resultMap=DeviceListResult}   
     ) 
    </select> 
</mapper> 

와 자바의 끝에

는 추가 :

mapper.getDeviceList(info); 

그런 info는 deviceList 가득합니다.

+0

고마워요. 처음 엔 제가 그렇게했습니다. 나는이 문제가 단일 매퍼 호출에서 해결 될 수 있다고 생각했다. – Dimanof