所以我有一个非常复杂的java对象,我使用MyBatis映射到我的数据库。我希望能够同时检索整个对象,包括所有的孩子,孙子等,所以我为它制作了一个结果图。它就像
<resultMap id="BaseResultMap" type="Parent">
<id column="PARENT_PK" jdbcType="VARCHAR" property="pk" />
<association property="address" javaType="address">
<id column="address_PK" jdbcType="VARCHAR" property="pk" />
</association>
<collection property="Children" javaType="java.util.ArrayList" ofType="Child">
<id column="CHILD_PK" property="Pk" jdbcType="VARCHAR" />
<result column="SCHEMA.CHILDREN.DESCRIPTION" property="description" jdbcType="VARCHAR" />
<collection property="Children" javaType="java.util.ArrayList" ofType="Grandchildren">
<id column="Grand_child_pk" jdbcType="VARCHAR" property="pk" />
<result column="SCHEMA.GRAND_CHILDREN.DESCRIPTION" property="description" jdbcType="VARCHAR" />
<collection property="children" javaType="java.util.ArrayList" ofType="GreatGrandChildren">
<result column="NAME" property="name" jdbcType="VARCHAR"/>
</collection>
</collection>
</collection
我的SQL就像
选择 PARENT_PK, ADDRESS_PK, CHILD_PK, SCHEMA.CHILDREN.DESCRIPTION, GRAND_CHILD_PK, SCHEMA.GRAND_CHILDREN.DESCRIPTION, 名称 从 ...
大多数字段填写正确,我在每个级别都能获得正确数量的子项。但是,两个描述字段都没有填充 - 我得到了空值。其他一切都很好。如果我使用Mybatis只检索孩子或孙子而不试图加载关系,那么描述字段可以正常工作。只有当我试图一次性获得所有东西时才会这样。
如果我手动运行查询,它检索描述列没问题,所以我不认为它是我的SQL代码的问题。
关于发生了什么的任何想法?
答案 0 :(得分:1)
我认为问题来自不同表中的相同列名:DESCRIPTION
。 MyBatis无法知道这两列来自哪些不同的表。尝试在选择查询中为这些列提供列别名:
SELECT PARENT_PK, ADDRESS_PK, CHILD_PK, SCHEMA.CHILDREN.DESCRIPTION C_DESC,
GRAND_CHILD_PK, SCHEMA.GRAND_CHILDREN.DESCRIPTION GC_DESC, NAME FROM ...
然后用别名映射:
<resultMap id="BaseResultMap" type="Parent">
<id column="PARENT_PK" jdbcType="VARCHAR" property="pk" />
<association property="address" javaType="address">
<id column="address_PK" jdbcType="VARCHAR" property="pk" />
</association>
<collection property="Children" javaType="java.util.ArrayList" ofType="Child">
<id column="CHILD_PK" property="Pk" jdbcType="VARCHAR" />
<result column="C_DESC" property="description" jdbcType="VARCHAR" />
<collection property="Children" javaType="java.util.ArrayList" ofType="Grandchildren">
<id column="Grand_child_pk" jdbcType="VARCHAR" property="pk" />
<result column="GC_DESC" property="description" jdbcType="VARCHAR" />
<collection property="children" javaType="java.util.ArrayList" ofType="GreatGrandChildren">
<result column="NAME" property="name" jdbcType="VARCHAR"/>
</collection>
</collection>
</collection>
</resultmap>