MyBatis没有检索某些字段

时间:2014-12-22 20:11:41

标签: sql mybatis mybatis-generator

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

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

1 个答案:

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