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