4

问题

我有一个返回 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>intypeCountMap指的是地图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

4 回答 4

4

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

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

于 2015-02-27T17:17:03.920 回答
3

如果您使用的是 3.1.1,您可以只定义 <id column="leave_type_id" /> 没有属性属性
如果您不使用 3.1.1,您可以添加 <result property="abbr" column="leave_type_id" />在列表顶部将字段包含在缓存键计算中以进行关联,稍后重新定义将分配正确的值

于 2014-03-06T17:22:46.053 回答
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>
于 2013-05-13T15:52:12.917 回答
1

你应该换行 <result property="id" column="leave_type_id"/>

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

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

于 2016-12-29T06:38:16.480 回答