为什么 MyBatis 返回一个空对象集合?

Why is MyBatis returning a Collection of null objects?

我有以下基本型号:

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_ID 年龄为 14 岁的拆分。没有对任何列施加约束,因为它是没有在我必须这样做的文档中指定,即这些都是简单的数据类型,NUMBERVARCHAR 没有 PRIMARY KEYNOT NULL 等的概念

然后在我的代码中调用:

Sandbox sandbox = session.selectOne("Sandbox.selectSandbox", 14);

这个 return 是一个 Sandbox 对象,其 NameAge 字段设置正确,但是,与 splits 关联的数组只是一个数组的空值。如果我要保证唯一性,把collection改成association也是一样的,split就是null

我已经盯着这个看一段时间了,我已经尝试了 collection 标签中 column 的各种值,以及 selectSplit 条目的各种变体,但是 none 有效,它们总是 return split 的空值。更烦人的是,没有抛出任何异常,因此似乎生成的所有 SQL 查询实际上都是有效的(很可能最后一个 #{age} 本身就是 null)。

有人可以解释一下如何使用 MyBatis 填充 List<Split> 来检索 Sandbox 的实例吗?文档很有帮助,但我已经按照示例进行操作,我认为是正确的,但我仍然没有得到预期的结果。

原来难点在这一行:

<select id="selectSplit" parameterType="int" resultType="com.scibor.Split">

我认为理所当然的一件事是 Split 中的 属性 名称与关联的 table 的列名称不匹配。因此,我没有使用 resultType,而是创建了以下内容:

<resultMap id="SplitMap" type="Split">
    <id column="SANDBOX_ID" property="sandboxId"/>
</resultMap>

这解决了问题。