2016-10-31 8 views
0

Я пытаюсь сопоставить ResultSet из хранимой процедуры Sybase с помощью MyBatis, но у меня возникают некоторые проблемы с неназванными столбцами на нем. Процедура возвращает одну строку с 4-мя колоннами, 2 из которых не имеют никакого названия на все:MyBatis и Sybase Сохраненная процедура - ResultSet с неназванными столбцами

+---id---|------|-----------|---description---+ 
    1  name1 surname1  desc1 

Файл resultmap .xml выглядит следующим образом (проверьте, второй и третий результат теги):

<resultMap id="person" type="foo.Person"> 
    <result column="id" property="id"/> 
    <result column="" property="name"/> 
    <result column="" property="surname"/> 
    <result column="description" property="description"/> 
</resultMap> 

У меня нет контроля над кодом хранимой процедуры, поэтому добавление псевдонима к неназванным столбцам не представляется возможным. Проверка предыдущих версий MyBatis, я видел, что в прошлом вы могли бы сообщить columnIndex в ResultMap, но теперь, похоже, он больше не доступен. Есть ли какой-то пользовательский обработчик ResultSet, который может быть использован для этого? Или, может быть, какой-то индивидуальный TypeHandler?

ответ

0

Это обходное решение, но поскольку вы не можете изменить процедуру в базе данных, чтобы добавить имена, я не могу думать о другом.

Идея заключается в создании обработчика типа, специфичного для этих полей. Обратите внимание: если у вас есть одно неназванное поле, вы можете просто сопоставить его, используя пустое имя столбца.

Так что в вашем случае результат карта будет выглядеть следующим образом:

<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); 
    } 
    ... 
} 

Важно заметить, что вызываемый метод проходит ColumnName , который в этом случае будет пустым, поэтому просто игнорируйте его и возвращайте индекс столбца.

Кроме того, индекс столбца ResultSet начинается с 1, так что в этом случае, чтобы получить имя вы получаете 2, для фамилии реализация будет:

... 
return rs.getString(3); 
... 

Другой важной деталью является то, что порядок следования столбцов должен быть связан к порядку возврата, определенному в вашей процедуре, а не к вашей карте результатов. Если столбец «name» был после столбца «описание» на приведенной выше карте результатов, но возврат процедуры не изменился, индекс, используемый в getString, будет равен 2, а не 4.

Надеюсь, это поможет.