Как вы отображаете список<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>