MyBatis不会返回查询中的所有结果

时间:2013-04-25 19:23:55

标签: sql associations mybatis

问题

我有一个返回17条记录的查询。当我将MyBatis与具有<association>的地图一起使用时,它会返回6条记录。 请注意,我的其他地图不会发生这种情况,我还有许多其他地图都有关联,这些地图都可以正常使用。

查询:

    with leave_counts as 
    (
        select leave_type_id, count(llm.leave_id) as count
        from lw_leave_master llm
        group by leave_type_id
    )
    select llt.leave_type_id, llt.leave_type_abbr_tx, 
            llt.leave_type_desc_tx, lc.count as count_nm
    from lw_leave_type llt
        join leave_counts lc on lc.leave_type_id=llt.leave_type_id
    order by llt.leave_type_abbr_tx

地图

<resultMap id="typeCountMap" type="mypackage.myclass">
    <result property="count" column="count_nm"/>
    <association property="type" resultMap="package.myMap"/>
</resultMap>


<resultMap id="myMap" type="mypackage.myclass2">
    <result property="id" column="leave_type_id"/>
    <result property="abbr" column="leave_type_abbr_tx"/>
    <result property="description" column="leave_type_desc_tx"/>
</resultMap>

<association>中的typeCountMap是指地图myMap

每次返回6条记录。从记录器中抓取实际查询并手动运行它将返回17条记录。

解决方案?

我可以做两件事让MyBatis返回所有17条记录

#1

如果我从查询中删除lc.count as count_nm,我会返回所有17条记录(只是没有与之关联的值)

    with leave_counts as 
    (
        select leave_type_id, count(llm.leave_id) as count
        from lw_leave_master llm
        group by leave_type_id
    )
    select llt.leave_type_id, llt.leave_type_abbr_tx, 
            llt.leave_type_desc_tx
    from lw_leave_type llt
        join leave_counts lc on lc.leave_type_id=llt.leave_type_id
    order by llt.leave_type_abbr_tx

这显然不是一个好的解决方案,但我希望将其包括在内,以防它能帮助你弄清楚我做错了什么。

#2

如果我将关联替换为其他地图的内容,一切都按预期工作。

<resultMap id="typeCountMap" type="mypackage.myclass1">
    <result property="count" column="count_nm"/>        
    <result property="type.id" column="leave_type_id"/>
    <result property="type.abbr" column="leave_type_abbr_tx"/>
    <result property="type.description" column="leave_type_desc_tx"/>
</resultMap>

如果我找不到其他解决方案,这显然是我要做的,因为这确实有效。像我在其他地图中使用的<association>一样好。

我应该注意到我正在使用MyBatis 3.1.1

4 个答案:

答案 0 :(得分:4)

我最近遇到了同样的问题。我相信这个问题与我的主要resultMap有关,其中的关联没有id列,而我的关联的resultMap确实有一个id列。我的结果按关联ID列分组。

为了解决这个问题,我在查询中选择了行号,并在指向行号列的主resultMap中添加了一个id。

答案 1 :(得分:3)

如果您使用3.1.1,则只能定义&lt; id column =&#34; leave_type_id&#34; /&GT;没有属性属性
如果您不使用3.1.1,则可以添加&lt; result property =&#34; abbr&#34;柱=&#34; leave_type_id&#34; /&GT;在列表的顶部将字段包含到用于关联的缓存键计算中,稍后重新定义将分配正确的值

答案 2 :(得分:1)

我不知道这是不是问题,但是要尝试一下。我必须在这里发帖,因为我没有足够的代表发表评论。

尝试向关联添加列属性并在第二个地图中标记ID列:

<resultMap id="typeCountMap" type="mypackage.myclass">
    <result property="count" column="count_nm"/>
    <association property="type" column="leave_type_id" resultMap="package.myMap"/>
</resultMap>

<resultMap id="myMap" type="mypackage.myclass2">
    <id property="id" column="leave_type_id"/>
    <result property="abbr" column="leave_type_abbr_tx"/>
    <result property="description" column="leave_type_desc_tx"/>
</resultMap>

答案 3 :(得分:1)

您应该替换第len

<result property="id" column="leave_type_id"/>

在mybatis中,你不应该错过指定id列,它可能会弄乱你的结果集。