La carte des résultats ressemble à ceci :
<resultMap id="UserResult" type="User">
<id property="userId" column="userId"/>
<result property="firstName" column="firstName"/>
<result property="lastName" column="lastName"/>
</resultMap>
Dans votre instruction select, changez le type de paramètre en java.util.Map.
<select id="getUsers" statementType="CALLABLE" parameterType="java.util.Map">
{call GetUsers(#{users, jdbcType=CURSOR, javaType=java.sql.ResultSet, mode=OUT, resultMap=UserResult})}
</select>
Votre interface de mappeur ressemble à ceci, il semble que vous l'appeliez actuellement le DAO. La façon dont je l'ai fait dans le passé est de créer une interface de mappeur qui est injectée dans le DAO et le DAO est ce qui appelle les méthodes sur le mappeur. Voici un exemple d'interface de mappeur :
public interface UserMapper {
public Object getUsers(Map<String, Object> params);
}
Cette classe de mappeur serait ensuite injectée dans une classe DAO et passerait l'appel comme ceci :
public List<User> getUsers() {
Map<String, Object> params = new HashMap<String, Object>();
ResultSet rs = null;
params.put("users", rs);
userMapper.getUsers(params);
return ((ArrayList<User>)params.get("users"));
}