5

我有这样的课

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

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

我将如何为 _strings 进行映射?

我试过这个,但它抱怨找不到 List 类型处理程序,如果我将它映射为对象,它不会抱怨。

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

所以我搜索了谷歌并找到了这个解决方法(最初是针对 Java 问题,不知道它是否可以在 C# 中工作)

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

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

这至少可以让测试运行,并且它可以很好地返回我的对象​​的其余部分,并且我的列表具有正确数量的条目,除了它们都是空白的。

我认为问题在于属性属性是空白的,但我不确定应该去那里。(我也尝试过使用“价值”,但这也不起作用)。这似乎应该简单得多,我只是忽略了一些明显的东西。

谢谢。

4

8 回答 8

5

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

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

然后你可以这样称呼它:

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

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

于 2010-08-20T09:34:03.273 回答
4

我的经验是使用 Java 版本的 iBATIS,但该解决方案仍然适用于 C# 窥视者。

给定一个班级

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>

希望这可以帮助。

于 2010-02-02T21:30:52.723 回答
1

至少在 iBATIS3 for Java 中,您的上述内容可以使用如下的 resultMap:

<resultMap id="someClassMap" type="SomeClass"> 
    <collection property="Strings" ofType="String"/> 
</resultMap>
于 2009-09-03T17:47:58.430 回答
1

以下是我对Java版IBatis(2.3.4版)的体验。我的场景是我希望 Ibatis 返回给定参数列表的键和值映射。使用 Ibatis 的 queryForMap 方法返回一个映射,其中键是对象,值是对象的集合(此示例键是 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>

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

于 2011-03-21T12:17:14.317 回答
1

如果是 IBatis-3,只需在下面使用

<select id="getFilteredList" resultType="String"> your sql here</select>
于 2014-05-13T08:39:05.597 回答
0

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

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

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

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

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

于 2009-07-21T21:59:58.357 回答
0

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

于 2010-02-05T17:08:54.880 回答
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>
于 2017-02-06T22:29:53.033 回答