MyBatis的与收集RowBounds的resultMap没有返回预期的结果中

问题描述 投票:0回答:1

Mapper.xml

<resultMap id="resultMap" type="dBWrapper">
    <result property="id" column="id" />
    <result property="code" column="code" />
    <result property="description" column="description" />
    <collection property="orderIds" ofType="java.lang.Long" >
        <result column="orderId" />
    </collection>
</resultMap>

<select id="selectAllProducts" resultMap="resultMap" parameterType="dBWrapper">
    SELECT product.id, product.code, product.description, provider.providerName, order.orderId
    FROM Product product
    LEFT JOIN Order order on product.id = order.productId
    WHERE 1=1
    <if orderSearchId != ''> 
        and order.orderId = #{orderSearchId}
    </if>
</select>

Java代码编写检索分页列表:

productList = productMapper.selectAllProducts(searchObj, new RowBounds((searchObj.getPage() - 1) * searchObj.getTotal(), searchObj.getTotal()));

使得对于第1页与3条记录,它被称为与RowBounds(0,3)。对于第2页,它被称为与RowBounds(3,3),用于第3页RowBounds(6,3)。

在MyBatis的日志上述功能的SQL查询返回以下

id      code      description      orderId
-------------------------------------------
1       101       Samolina         200
1       101       Samolina         201
2       102       Trampoline       300
2       102       Trampoline       301
2       102       Trampoline       302
2       102       Trampoline       303
3       103       Pajar            401
3       103       Pajar            402
4       104       Tramtor          500
4       104       Tramtor          501
4       104       Tramtor          502
5       105       Wadnor           600
5       105       Wadnor           601
5       105       Wadnor           602
5       105       Wadnor           603
6       106       Bramget          701
6       106       Bramget          702

然而,当MyBatis的应用寻呼和收集,下面的记录看到的第一个页面(这是罚款)上。

id      code      description      orderIds
-------------------------------------------
1       101       Samolina         (200,201)
2       102       Trampoline       (300,301,302,303)
3       103       Pajar            (401,402)

因此,对于第二页,记录应该从ID开始= 4,但是,这是由MyBatis的第二页是什么返回。

id      code      description      orderIds
-------------------------------------------
2       102       Trampoline       (301,302,303)
3       103       Pajar            (401,402)
4       104       Tramtor          (500,501,502)

现在,如果你看一下实际的查询返回什么数据库,第四届记录如下。而这正是第2页真正开始。注意300缺少订单ID在页面2.它的第一条记录,因为订单id = 300是在实际查询第三记录,因此它不包括在内。

id      code      description      orderId
-------------------------------------------
2       102       Trampoline       301

有什么我失踪约MyBatis的分页或集合?

java pagination mybatis
1个回答
1
投票

我看到在你的代码的几个问题:

  • 如果您正在使用分页,你需要ORDER BY添加到您的SQL。当不存在SQL以任意顺序返回行,以及订单可能/会随时间而改变。我认为这是在你的代码中的关键错误。
  • 此外,这是非常明智的,以指定的封闭实体的一些属性的<id>标签。否则,它会变得非常缓慢。
  • 另外,使用<其中>子句代替WHERE 1=1的。 MyBatis会如果需要在运行时自动删除第一个and

这是你的映射器的修改版本:

<resultMap id="resultMap" type="dBWrapper">
    <id property="id" column="id" /> <!-- I used ID here -->
    <result property="code" column="code" />
    <result property="description" column="description" />
    <collection property="orderIds" ofType="java.lang.Long" >
        <result column="orderId" />
    </collection>
</resultMap>

<select id="selectAllProducts" resultMap="resultMap" parameterType="dBWrapper">
    SELECT product.id, product.code, product.description, 
      provider.providerName, order.orderId
    FROM Product product
    LEFT JOIN Order order on product.id = order.productId
    <where>
      <if test="orderSearchId != null"> 
        and order.orderId = #{orderSearchId}
      </if>
    </where>
    ORDER BY product.id, order.id
</select>
© www.soinside.com 2019 - 2024. All rights reserved.