Как вы отображаете список <string>в iBatis? - PullRequest
5 голосов
/ 15 июля 2009

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

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 ]

5 голосов
/ 20 августа 2010

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

<code><sqlMap namespace="Users"></code>
<code><select id="names" resultClass="java.lang.String"></code>
        select first_name as firstName from user
<code></select></code>
<code><sqlMap>

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

<code>List<code><String></code> userNames = (List<code><String></code>)sqlMap.queryForList("Users.names");

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

4 голосов
/ 03 февраля 2010

Мой опыт работы с 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>

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

1 голос
/ 13 мая 2014

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

<select id="getFilteredList" resultType="String"> your sql here</select>
1 голос
/ 21 марта 2011

Ниже приведен мой опыт работы с 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, кажется, имеет лучший синтаксис для определения и обработки сценария, как указано выше.

1 голос
/ 03 сентября 2009

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

<resultMap id="someClassMap" type="SomeClass"> 
    <collection property="Strings" ofType="String"/> 
</resultMap>
0 голосов
/ 07 февраля 2017

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

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>
0 голосов
/ 05 февраля 2010

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

0 голосов
/ 22 июля 2009

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

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

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

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

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

...