为什么 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 岁的拆分。没有对任何列施加约束,因为它是没有在我必须这样做的文档中指定,即这些都是简单的数据类型,NUMBER
和 VARCHAR
没有 PRIMARY KEY
、NOT NULL
等的概念
然后在我的代码中调用:
Sandbox sandbox = session.selectOne("Sandbox.selectSandbox", 14);
这个 return 是一个 Sandbox
对象,其 Name
和 Age
字段设置正确,但是,与 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>
这解决了问题。
我有以下基本型号:
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 岁的拆分。没有对任何列施加约束,因为它是没有在我必须这样做的文档中指定,即这些都是简单的数据类型,NUMBER
和 VARCHAR
没有 PRIMARY KEY
、NOT NULL
等的概念
然后在我的代码中调用:
Sandbox sandbox = session.selectOne("Sandbox.selectSandbox", 14);
这个 return 是一个 Sandbox
对象,其 Name
和 Age
字段设置正确,但是,与 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>
这解决了问题。