iBatis не заполняет объект, когда не найдено ни одной строки - PullRequest
8 голосов
/ 10 ноября 2009

Я выполняю хранимую процедуру, которая возвращает 2 курсора, и ни у одного из них нет данных. У меня есть следующее сопоставление XML:

<resultMap id="resultMap1" class="HashMap">
  <result property="firstName" columnIndex="2"/>
</resultMap>

<resultMap id="resultMap2" class="com.somePackage.MyBean">
  <result property="unitStreetName" column="street_name"/>
</resultMap>

<parameterMap id="parmmap" class="map">
  <parameter property="id" jdbcType="String" javaType="java.lang.String" mode="IN"/>
  <parameter property="Result0" jdbcType="ORACLECURSOR" javaType="java.sql.ResultSet" mode="OUT" resultMap="resultMap1"/>
  <parameter property="Result1" jdbcType="ORACLECURSOR" javaType="java.sql.ResultSet" mode="OUT" resultMap="resultMap2"/>
</parameterMap>

<procedure id="proc" parameterMap="parmmap">
    { call my_sp (?,?,?) }
</procedure>

Первый набор результатов помещается в HashMap ... второй набор результатов помещается в класс MyBean.

Код

в моем DAO следующий:

HashMap map = new HashMap()
map.put("id", "1234");
getSqlMapClientTemplate().queryForList("mymap.proc", map);
HashMap result1 = (HashMap)((List)parmMap.get("Result0")).get(0);
MyBean myObject = (MyBean)((List)parmMap.get("Result1")).get(0);//code fails here

в последней строке выше .. мой код не выполняется. Сбой из-за того, что второй курсор не имеет строк, и поэтому ничего не заносится в список. Тем не менее, первый курсор также ничего не возвращает, но поскольку результаты помещаются в HashMap список для первого курсора, по крайней мере, содержит HashMap объект внутри него.

Почему эта разница? Есть ли способ заставить iBatis поместить объект MyBean в список, даже если не возвращены строки? Или я должен обрабатывать это в моем DAO ... Я хочу избежать обработки этого в DAO, потому что у меня есть целая куча DAO, подобных этим.

Ответы [ 2 ]

1 голос
/ 01 июля 2011

Ibatis не создает и не возвращает объекты, если набор результатов пуст (или в вашем случае, если третий параметр вашей хранимой процедуры возвращает ноль).

Я заметил при написании typeHandlers, что они даже не вызываются, когда не возвращается результат, так что маршрут также не поможет.

Я уверен, что у вас есть веские причины для создания пустых объектов в этом случае, но я боюсь, что единственный способ - обнаружить нули в вашем DAO.

Если у вас есть много DAO с этой проблемой, вы можете сделать так, чтобы они расширили суперкласс и использовали удобный метод, который проверяет пустой список или нулевой объект и возвращает пустой объект в этом случае.

0 голосов
/ 17 июня 2011

На самом деле я считаю, что Result1 поведение является правильным (результаты не всегда должны приводить к пустому списку).

После того, как вы дважды проверили, что Result0 действительно пустой курсор (в отличие от - например, курсора с одной строкой all-fields-are-null), я думаю, вы можете начать поиск ошибки в iBatis:)

Что касается вашего второго вопроса, я не верю, что iBatis может вам помочь (или что он должен: такие дефолты не являются частью интерфейса приложения базы данных & hArr; и поэтому их лучше всего обрабатывать в DAO - или, возможно, даже дальше). иерархия услуг).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...