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的分页或集合?
我看到在你的代码的几个问题:
ORDER BY
添加到您的SQL。当不存在SQL以任意顺序返回行,以及订单可能/会随时间而改变。我认为这是在你的代码中的关键错误。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>