我有以下基本型号:
public class Sandbox {
private String firstName;
private Integer age;
private List<Split> split;
}
public class Split {
private Integer sandboxId;
}
我的SandboxMapper配置如下:
<resultMap id="SandboxMap" type="Sandbox">
<id property="firstName" column="FIRSTNAME"/>
<result property="age" column="AGE"/>
<collection property="split" javaType="list" ofType="Split" column="AGE" select="selectSplit">
<id property="sandboxId" column="SANDBOX_ID"/>
</collection>
</resultMap>
<select id="selectSandbox" resultMap="SandboxMap">
SELECT * FROM SANDBOX
WHERE AGE=#{age}
</select>
<select id="selectSplit" parameterType="int" resultType="com.scibor.Split">
SELECT * FROM SPLIT
WHERE Split.SANDBOX_ID=#{age}
</select>
我在我的数据库中有一些条目,例如有一个年龄为14的Sandbox,并且有一些Splits,其SANDBOX_ID为14.对任何列都没有强制约束,因为文档中没有指定我必须这样做,即这些都是简单的数据类型,NUMBER
和VARCHAR
没有PRIMARY KEY
,NOT NULL
等概念。
在我的代码中,我然后调用:
Sandbox sandbox = session.selectOne("Sandbox.selectSandbox", 14);
这会返回一个Sandbox
对象,其Name
和Age
字段已正确设置,但是,与splits
关联的数组只是一个空数组。如果我要保证唯一性并将collection
更改为association
,那么split
只会是null
。
我一直在盯着这一段时间,我在column
标签中尝试了collection
的各种值,以及selectSplit
条目的各种变体,但是它们都不起作用,它们总是返回split
的空值。更令人讨厌的是,没有抛出任何异常,因此似乎生成的所有SQL查询实际上都是有效的(很可能最后#{age}
本身就是null
)。
有人可以解释我如何使用MyBatis检索Sandbox
填充List<Split>
的实例吗?文档是有用的,但我已经按照示例进行了操作,我认为确切,但我仍然没有得到预期的结果。
答案 0 :(得分:1)
事实证明,困难在于这一行:
<select id="selectSplit" parameterType="int" resultType="com.scibor.Split">
我认为理所当然的一件事是,Split中的属性名称与关联表的列名称不匹配。因此,我不必使用resultType
,而是创建以下内容:
<resultMap id="SplitMap" type="Split">
<id column="SANDBOX_ID" property="sandboxId"/>
</resultMap>
这解决了这个问题。