代码之家  ›  专栏  ›  技术社区  ›  wen tian

如何解决MyBatis分页PageHelper查询返回的数据存在重复?

  •  0
  • wen tian  · 技术社区  · 7 年前

    当我使用MyBatis Pagination PageHelper时,查询返回的结果是重复的。我觉得不应该!,因为当我查询两个表时会影响重复问题。例如,我编写的sql映射文件包含以下代码:

    SELECT
        o.id,
        o.uid,
        u.nickname,
        o.order_num,
        o.order_type,
        o.order_price,
        o.pay_type,
        o.order_status,
        o.name,
        o.phone,
        o.delivery_time,
        o.createtime
    FROM
        orders AS o,
        water_member AS u
    
    WHERE
        o.order_status = 1
    ORDER BY
        o.id
    DESC
    

    但它有重复:

    enter image description here

    取消援助。JAVA

    @RestController
    public class UnpaidOrderController {
    
    @Autowired
    private UnpaidOrderService unpaidOrderService;
    
    @RequestMapping(value = "unpaidorder",method = RequestMethod.GET)
    public Object getByPage(@RequestParam(value = "pageNo",  defaultValue = "1")  int pageNo,
                            @RequestParam(value = "pageSize", defaultValue = "3")  int pageSize) {
    
        Page<UnpaidOrder> list = unpaidOrderService.findByPage(pageNo, pageSize);
        JSONObject jsonObject = new JSONObject();
        jsonObject.put("msg","查询成功");
        jsonObject.put("data",list);
        return jsonObject;
    }}
    

    取消帮助OrderMapper。JAVA

    @Mapper
    public interface UnpaidOrderMapper {
    Page<UnpaidOrder> findByPage();
    }
    

    取消付费订购服务。JAVA

    public interface UnpaidOrderService {
    Page<UnpaidOrder> findByPage(int pageNo, int pageSize);}
    

    UnpaidOrderServiceImpl。JAVA

    @Service
    public class UnpaidOrderServiceImpl implements UnpaidOrderService {
    @Autowired
    private UnpaidOrderMapper unpaidOrderMapper;
    public Page<UnpaidOrder> findByPage(int pageNo, int pageSize) {
        PageHelper.startPage(pageNo,pageSize);
        return unpaidOrderMapper.findByPage();
     }
     }
    

    取消帮助OrderMapper。xml

    <mapper namespace="com.zyl.water.mapper.UnpaidOrderMapper">
    <!-- 映射订单对象的resultMap -->
    <resultMap id="BaseResultMap" type="UnpaidOrder">
        <result column="id" property="id" />
        <result column="uid" property="uid" />
        <result column="nickname" property="nickname" />
        <result column="order_num" property="order_num" />
        <result column="order_type" property="order_type" />
        <result column="pay_type" property="pay_type" />
        <result column="order_status" property="order_status" />
        <result column="name" property="name" />
        <result column="phone" property="phone" />
        <result column="delivery_time" property="delivery_time" />
        <result column="createtime" property="createtime" />
    </resultMap>
    
    <!-- 查询未支付订单 -->
    <select id="findByPage" resultMap="BaseResultMap">
        SELECT
            o.id,
            o.uid,
            u.nickname,
            o.order_num,
            o.order_type,
            o.order_price,
            o.pay_type,
            o.order_status,
            o.name,
            o.phone,
            o.delivery_time,
            o.createtime
        FROM
            orders AS o,
            water_member AS u
    
        WHERE
            o.order_status = 1
        ORDER BY
            o.id
        DESC
    
    </select>
    

    1 回复  |  直到 7 年前
        1
  •  0
  •   The Impaler    7 年前

    我想谈谈你的分页策略。

    这不是MyBatis的问题,而是你的问题。分页时,需要指定 唯一的 对一组列进行排序。

    这是因为在SQL中,默认情况下,行没有特定的顺序。因此,当 ORDER BY 条款不够具体。这样,“第1页”和“第2页”最终可能会显示几个/很多相同的行。

    每次执行查询(每次单击“下一页”)时,必须明确指定行顺序,但您的情况并非如此。