如何在iBatis中映射List <string>?</string>

时间:2009-07-14 20:56:47

标签: c# mapping ibatis.net

我有一个这样的课程

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 个答案:

答案 0 :(得分:5)

使用IBatis的自动结果映射。这是Java中的解决方案,您可以轻松映射到C#。 这是你的sql map:

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

然后你可以这样称呼它:

<sqlMap namespace="Users">

因此,您不必创建具有一个属性的自定义类型。

答案 1 :(得分:4)

我的经验是使用Java版本的iBATIS,但解决方案应该仍适用于那里的C#peeps。

给出一个班级

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

您可以使用以下两个resultMaps填充字符串列表或其他简单类型(没有属性的类,如Integer,String等)

<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>

希望这有帮助。

答案 2 :(得分:1)

至少在iBATIS3 for Java中,您可以使用如下结果:

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

答案 3 :(得分:1)

以下是我使用Java版IBatis(版本2.3.4)的经验。我的场景是我希望Ibatis为我返回一个给定参数列表的键和值的映射。使用Ibatis queryForMap方法返回一个映射,其中键是一个Object,值是一个对象的集合(这个例子Key是一个Wrapper,而值是Wrapper Longs的列表)。

创建占位符(使用getter / setter)以在查询执行时保存数据。

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>

我最初的麻烦是在父地图上获得别名'right和groupBy语法。拥有groupBy将获得Ibatis为elementId获取相同的对象以填充子项。一个没有groupBy的实例我发现,对于每个键,添加到列表中的前一个子项被最新的子项替换为新列表被初始化(注意我在写这个例子的时候还没有看到Ibatis的内部) 。占位符别名必须与父级和子级的resultMap匹配。 Ibatis 3似乎有更好的语法来定义和处理上面的场景。

答案 4 :(得分:1)

如果是IBatis-3,请使用以下

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

答案 5 :(得分:0)

由于没有找到解决方案,我只是采用了一种我并不特别自豪的方法。

我映射了一个除了字符串值之外没有其他属性的类。

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

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

iBatis似乎没有问题,只是映射到字符串集合。

答案 6 :(得分:0)

你可以使用'System.String'或'java.lang.String'作为属性

  

答案 7 :(得分:0)

这对我有用,从程序输出光标

获得了一个字符串列表
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>