Как вы отображаете список<string> в iBatis?

У меня есть такой класс

public SomeClass
{
   private List<string> _strings = new List<string>();

   public IEnumerable<string> Strings
   {
      {  get return _strings; }
   }
}

Как бы я сделал отображение для _strings?

Я попробовал это, но он жалуется на то, что не найден обработчик типа List, на что не жалуется, если я отобразил его как объект.

<result property="_strings" column="value" />

Поэтому я искал в Google и нашел этот обходной путь (изначально для проблемы с Java, не знаю, будет ли она работать в C#)

<result property="_strings" resultMapping="someMapping.StringList"/>

<resultMap id="StringList" class="System.String">
  <result property="" column="Value"/>
</resultMap>

Это по крайней мере позволяет запустить тест, и он возвращает остальную часть моего объекта в порядке, и мой список имеет правильное количество записей, за исключением того, что они все пустые.

Я думаю, что проблема в том, что атрибут свойства не заполнен, но я не уверен, что предполагается там. (Я также пытался использовать 'значение', но это тоже не сработало). Кажется, это должно быть намного проще, и я просто упускаю из виду нечто очевидное.

Благодарю.

8 ответов

Решение

Поскольку никакого решения не было найдено, я просто выбрал метод, которым я не особо горжусь.

Я сопоставил класс, у которого не было другого свойства, кроме строкового значения.

public class StringValue
{
    public String Name { get; set; }
}

<resultMap id="StringList" class="StringValue" >
  <result property="Name" column="Value"/>
</resultMap>

У iBatis, похоже, нет проблем с этим, только с отображением в коллекцию строк.

Используйте автоматическое отображение результатов IBatis. Это решение в Java, которое вы можете легко сопоставить с C#. Это ваша карта sql:

<sqlMap namespace="Users">
<select id="names" resultClass="java.lang.String">
        выберите first_name как firstName от пользователя
</select>
<sqlMap>

И тогда вы можете назвать это так:

List<String> userNames = (Список <String>) SqlMap.queryForList("Users.names"); 

Таким образом, вам не нужно создавать собственный тип с одним свойством, чтобы сделать это.

Мой опыт связан с Java-версией iBATIS, но решение все еще должно работать для C#.

Учитывая класс

class MyClass {
  int id;
  List<String> firstName;
}

Вы можете заполнить список строк или других простых типов (классов без атрибутов, таких как Integer, String и т. Д.) Следующими двумя resultMaps

<sqlMap namespace="ns">
  <resultMap id="ListMap" class="string">
    <result property="firstName" column="firstName" 
            javaType="java.util.List" jdbcType="VARCHAR"/>
  </resultMap>

  <resultMap id="PrimaryMap" class="MyClass" groupBy="id">
    <result property="id" columnName="id"/>
    <result property="firstname" resultMap="ns.ListMap" javaType="java.util.List"/>
  </resultMap>

  <select id="MySuperQuery" resultMap="PrimaryMap">
    select id, firstName from user
  </select>
</sqlMap>

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

Если IBatis-3, просто используйте ниже

<select id="getFilteredList" resultType="String"> your sql here</select>

Ниже приведен мой опыт работы с Java-версией IBatis (версия 2.3.4). Мой сценарий состоял в том, что я хотел, чтобы Ibatis вернул мне карту ключей и значений для данного списка параметров. Закончено использование метода Ibatis queryForMap для возврата карты, в которой ключ является объектом, а значения - коллекцией объектов (в этом примере ключ - оболочка, а значения - список длинных оболочек).

Создайте заполнитель (с получателями / установщиками) для хранения данных при выполнении запроса.

class PlaceHolder {
  private long elementId;;
  private List<Long> valueIds;
}

Определения Ibatis

<resultMap id="valueIdsMap" class="java.lang.Long">
    <result property="valueIds" column="otherId" javaType="java.util.List" jdbcType="NUMERIC"/>
</resultMap>

<resultMap id="testKeysAndValuesMap" groupBy="elementId" class="PlaceHolder">
    <result property="elementId" column="elementId" jdbcType="NUMERIC" javaType="java.lang.Long"/>
  <result property="valueIds" resultMap="MapName.valueIdsMap" javaType="java.util.List" />
</resultMap>

<select id="retrieveTestKeysAndValuesMap" resultMap="testKeysAndValuesMap" 
        parameterClass="java.util.List">
    SELECT
    table_name_1.column_fk as elementId,
    table_name_1.id as otherId
    FROM table_name_1
    WHERE table_name_1.column_fk IN
        <iterate open="(" close=")" conjunction=", ">
            #[]#
        </iterate>

Моими первоначальными проблемами было получение правильного псевдонима и синтаксиса groupBy на родительской карте. Наличие groupBy заставит Ibatis получить тот же объект для elementId для заполнения дочерних элементов. Один экземпляр без groupBy Я обнаружил, что для каждого ключа предыдущий дочерний элемент, добавленный в список, заменялся последним дочерним, поскольку новый список был инициализирован (обратите внимание, что я еще не заглядывал во внутреннюю часть Ibatis, поскольку я пишу этот пример), Псевдоним-заполнитель должен соответствовать resultMap родительского и дочернего элементов. Ibatis 3, кажется, имеет лучший синтаксис для определения и обработки сценария, как указано выше.

По крайней мере, в iBATIS3 для Java вы могли бы просто использовать resultMap, например:

<resultMap id="someClassMap" type="SomeClass"> 
    <collection property="Strings" ofType="String"/> 
</resultMap>

Вы можете просто использовать 'System.String' или 'java.lang.String' в качестве свойства

Это сработало для меня, получил список строк из курсора вывода процедуры

List ss = sqlmap.queryList(..

<resultMap id="emailsMap" class="java.lang.String">
        <result  column="E_MAIL" property="" /> 
</resultMap>

<parameterMap id="xp" class="java.util.Map">
    <parameter property="dd" jdbcType="VARCHAR" mode="IN" />
    <parameter property="outPutCursor" javaType="java.sql.ResultSet" jdbcType="ORACLECURSOR"  mode="OUT" />
    </parameterMap>
    enter code here

<procedure id="xx" parameterMap="xp" resultMap="emailsMap">
        { call aaa.bbb(?, ?) }
</procedure>
Другие вопросы по тегам