0

所以我有一个非常复杂的 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 代码的问题。

关于发生了什么的任何想法?

4

1 回答 1

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>
于 2014-12-23T06:55:10.077 回答