我有一个这样的课程
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>
这至少让测试运行,并且它返回我的其余对象,并且我的列表具有正确的条目数,除了它们都是空白的。
我认为问题是属性属性是空白的,但我不确定是什么意思去那里。 (我也尝试使用'价值',但这也不起作用)。这似乎应该更简单,我只是忽略了一些显而易见的事情。
感谢。
答案 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>