Это обходной путь, но, поскольку вы не можете изменить процедуру в базе данных для добавления имен, я не могу придумать другого способа.
Идея состоит в том, чтобы создать обработчик типа, специфичный для этих полей. Обратите внимание, что если у вас есть одно безымянное поле, вы можете просто отобразить его, используя пустое имя столбца.
Таким образом, в вашем случае карта результатов будет выглядеть так:
<resultMap id="person" type="foo.Person">
<result column="id" property="id"/>
<result column="" property="name" typeHandler="foo.PersonNameTypeHandler"/>
<result column="" property="surname" typeHandler="foo.PersonSurnameTypeHandler"/>
<result column="description" property="description"/>
</resultMap>
Драйвер sybase вернет все безымянные столбцы как "".
MyBatis требует, чтобы вы сопоставили свои столбцы с именем существующего столбца, иначе он не будет вызывать обработчик типа. Из-за этого вы не можете создать поддельное имя для этих столбцов, поэтому просто используйте пустое значение для всех безымянных столбцов, в конце пустое имя, если оно важно, просто чтобы заставить MyBatis обработать столбец.
Важная часть находится в обработчике типа, он просто возвращает значение на основе номера столбца, где должно быть «имя»:
public class PersonNameTypeHandler extends BaseTypeHandler<String> {
...
@Override
public String getNullableResult(ResultSet rs, String columnName) {
return rs.getString(2);
}
...
}
Важно отметить, что вызываемый метод передает имя столбца, которое в данном случае будет пустым, поэтому просто игнорируйте его и возвращайтесь по индексу столбца.
Кроме того, индекс столбца ResultSet начинается с 1, поэтому в этом случае, чтобы получить имя, которое вы получаете 2, для фамилии реализация будет следующей:
...
return rs.getString(3);
...
Еще одна важная деталь заключается в том, что порядок столбцов должен быть связан с порядком возврата, определенным в вашей процедуре, а не в вашей карте результатов. Если бы столбец «имя» был после столбца «описание» в приведенной выше карте результатов, но возврат процедуры не изменился, индекс, используемый в getString, по-прежнему будет равен 2, а не 4.
Надеюсь это поможет.
person
Andre Marques
schedule
07.12.2016