iBatis ResultMaps: имя столбца <...> не найдено в этом ResultSet - PullRequest
4 голосов
/ 07 апреля 2011

Учитывая ResultMap для запроса выбора iBatis, кажется обязательным, что все столбцы (которые сопоставлены со свойствами в ResultMap) фактически являются частью запроса SQL.

Но это немного раздражает, если кто-то хочетдля повторного использования ResultMaps, особенно если имеются «resultmaps внутри resultmaps».

Пример:

    <resultMap id="myResultMap"
      <result property="myPropName" column="myColumnName"/>
      <result property="someCollection" resultMap="otherResultMap"/>
    </resultMap>

    <resultMap id="otherResultMap" groupBy="..."
      <result property="otherPropName" column="otherColumnName"/>
    </resultMap>

Конечно, эти две карты результатов определены, потому что есть случай с запросом, который используетобъединение для загрузки объектов-контейнеров, содержащих myPropName и someCollection, содержащих коллекцию внутренних объектов.

Но если я хочу повторно использовать то же самое определение карты результатов для другого запроса на выборку, который должен загружать только объекты-контейнеры (с myPropName), но не нужно загружать внутренние объекты (в someCollection), тогда будет сообщение об ошибке:

Имя столбца 'otherColumnName' не найдено в этом ResultSet

Нет ли возможности, которая позволяет инициализировать someCollection со значением null или emp?коллекцию, если соответствующие свойства (в данном случае otherPropName) отсутствуют в запросе SQL?

Действительно ли необходимо создать еще одну карту результатов для этого сценария?

Использование iBatis (еще не myBatis) версия 2.3.4 ...

1 Ответ

6 голосов
/ 08 апреля 2011

«Проблема» есть во всех реализациях TypeHandler.Эти объекты должны извлечь значение столбца из ResultSet, сопоставив его с соответствующим типом Java.Например, в классе StringTypeHandler есть такой метод:

public Object getResult(ResultSet rs, String columnName) throws SQLException {
    Object s = rs.getString(columnName);
    if (rs.wasNull()) {
        return null;
    } else {
        return s;
    }
}

Если столбец отсутствует в ResultSet, строка rs.getString(columnName) выдает SQLException.Единственный способ избежать этой ошибки - написать собственный TypeHandler, который возвращает null вместо выдачи исключения.
Во всяком случае, я предлагаю вам использовать две таблицы результатов.

...