为什么MyBatis返回null对象的集合?

时间:2015-10-02 18:05:02

标签: java oracle mybatis

我有以下基本型号:

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.对任何列都没有强制约束,因为文档中没有指定我必须这样做,即这些都是简单的数据类型,NUMBERVARCHAR没有PRIMARY KEYNOT NULL等概念。

在我的代码中,我然后调用:

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

这会返回一个Sandbox对象,其NameAge字段已正确设置,但是,与splits关联的数组只是一个空数组。如果我要保证唯一性并将collection更改为association,那么split只会是null

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

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

1 个答案:

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

这解决了这个问题。