- 优化订单查询,和 convert 转换

This commit is contained in:
sin 2019-03-24 16:58:24 +08:00
parent 6cc00a373b
commit e9b5adeac3
26 changed files with 211 additions and 116 deletions

View File

@ -1,4 +1,4 @@
package cn.iocoder.mall.order;
package cn.iocoder.mall.order.application;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

View File

@ -1,4 +1,4 @@
package cn.iocoder.mall.order.config;
package cn.iocoder.mall.order.application.config;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.*;

View File

@ -1,4 +1,4 @@
package cn.iocoder.mall.order.config;
package cn.iocoder.mall.order.application.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

View File

@ -1,4 +1,4 @@
package cn.iocoder.mall.order.controller.admins;
package cn.iocoder.mall.order.application.controller.admins;
import cn.iocoder.common.framework.vo.CommonResult;
import cn.iocoder.mall.order.api.OrderService;
@ -6,10 +6,10 @@ import cn.iocoder.mall.order.api.dto.OrderItemUpdateDTO;
import cn.iocoder.mall.order.api.dto.OrderLogisticsUpdateDTO;
import cn.iocoder.mall.order.api.dto.OrderPageBO;
import cn.iocoder.mall.order.api.dto.OrderQueryDTO;
import cn.iocoder.mall.order.convert.OrderConvert;
import cn.iocoder.mall.order.vo.OrderItemUpdateVO;
import cn.iocoder.mall.order.vo.OrderLogisticsVO;
import cn.iocoder.mall.order.vo.OrderPageQueryVO;
import cn.iocoder.mall.order.application.convert.OrderConvertAPP;
import cn.iocoder.mall.order.application.vo.OrderItemUpdateVO;
import cn.iocoder.mall.order.application.vo.OrderLogisticsVO;
import cn.iocoder.mall.order.application.vo.OrderPageQueryVO;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
@ -34,23 +34,23 @@ public class AdminsOrderController {
@GetMapping("page")
@ApiOperation("订单列表")
public CommonResult<List<OrderPageBO>> getOrderPage(@RequestBody OrderPageQueryVO orderPageQueryVO) {
OrderQueryDTO orderQueryDTO = OrderConvert.INSTANCE.convertPageBO(orderPageQueryVO);
public CommonResult<List<OrderPageBO>> getOrderPage(@Validated OrderPageQueryVO orderPageQueryVO) {
OrderQueryDTO orderQueryDTO = OrderConvertAPP.INSTANCE.convertPageBO(orderPageQueryVO);
CommonResult<List<OrderPageBO>> result = orderService.getOrderPage(orderQueryDTO);
return result;
}
@PutMapping("order/update")
@PutMapping("order_item/update")
@ApiOperation("订单item更新")
public CommonResult updateOrderItem(@RequestBody @Validated OrderItemUpdateVO orderItemUpdateVO) {
OrderItemUpdateDTO dto = OrderConvert.INSTANCE.convertPageBO(orderItemUpdateVO);
OrderItemUpdateDTO dto = OrderConvertAPP.INSTANCE.convertPageBO(orderItemUpdateVO);
return orderService.updateOrderItem(dto);
}
@PutMapping("logistics/update")
@ApiOperation("订单物流更新")
public CommonResult updateLogistics(@RequestBody @Validated OrderLogisticsVO orderLogisticsVO) {
OrderLogisticsUpdateDTO dto = OrderConvert.INSTANCE.convertPageBO(orderLogisticsVO);
OrderLogisticsUpdateDTO dto = OrderConvertAPP.INSTANCE.convertPageBO(orderLogisticsVO);
return orderService.updateLogistics(dto);
}
}

View File

@ -1,4 +1,4 @@
package cn.iocoder.mall.order.controller.users;
package cn.iocoder.mall.order.application.controller.users;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

View File

@ -0,0 +1,34 @@
package cn.iocoder.mall.order.application.convert;
import cn.iocoder.mall.order.api.dto.OrderItemUpdateDTO;
import cn.iocoder.mall.order.api.dto.OrderLogisticsUpdateDTO;
import cn.iocoder.mall.order.api.dto.OrderQueryDTO;
import cn.iocoder.mall.order.application.vo.OrderItemUpdateVO;
import cn.iocoder.mall.order.application.vo.OrderLogisticsVO;
import cn.iocoder.mall.order.application.vo.OrderPageQueryVO;
import org.mapstruct.Mapper;
import org.mapstruct.Mappings;
import org.mapstruct.factory.Mappers;
/**
* application 订单 convert
*
* TODO 这种方式 文件名不能一样哈!
*
* @author Sin
* @time 2019-03-24 10:45
*/
@Mapper
public interface OrderConvertAPP {
OrderConvertAPP INSTANCE = Mappers.getMapper(OrderConvertAPP.class);
@Mappings({})
OrderQueryDTO convertPageBO(OrderPageQueryVO orderPageQueryVO);
@Mappings({})
OrderLogisticsUpdateDTO convertPageBO(OrderLogisticsVO orderLogisticsVO);
@Mappings({})
OrderItemUpdateDTO convertPageBO(OrderItemUpdateVO orderItemUpdateVO);
}

View File

@ -1,4 +1,4 @@
package cn.iocoder.mall.order.vo;
package cn.iocoder.mall.order.application.vo;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;

View File

@ -1,4 +1,4 @@
package cn.iocoder.mall.order.vo;
package cn.iocoder.mall.order.application.vo;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;

View File

@ -1,6 +1,5 @@
package cn.iocoder.mall.order.vo;
package cn.iocoder.mall.order.application.vo;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;

View File

@ -56,7 +56,7 @@ public interface OrderService {
* - 联系人电话
* - 联系人姓名
*/
CommonResult updateLogistics(OrderLogisticsDTO orderLogisticsDTO);
CommonResult updateLogistics(OrderLogisticsUpdateDTO orderLogisticsDTO);
/**
* 删除订单

View File

@ -10,7 +10,9 @@ package cn.iocoder.mall.order.api.constant;
*/
public enum OrderErrorCodeEnum {
ORDER_ITEM_ONLY_ONE(1000001000, "订单Item只有一个"),
ORDER_ITEM_ONLY_ONE(1000001000, "订单Item只有一个!"),
ORDER_GET_SKU_FAIL(1000001001, "获取商品失败!"),
ORDER_GET_SKU_NOT_EXISTENT(1000001002, "获取的商品不存在!"),
;
private final int code;

View File

@ -10,8 +10,8 @@ public enum OrderHasReturnExchangeEnum {
NO(1, "没有"),
RETURN_GOODS(2, "退货"),
EXCHANGE_GOODS(2, "换货"),
RETURN_EXCHANGE_GOODS(2, "退换货");
EXCHANGE_GOODS(3, "换货"),
RETURN_EXCHANGE_GOODS(4, "退换货");
/**
* 状态值

View File

@ -10,7 +10,7 @@ import java.io.Serializable;
* @author Sin
* @time 2019-03-17 20:22
*/
public class OrderLogisticsDTO implements Serializable {
public class OrderLogisticsUpdateDTO implements Serializable {
/**
* 订单 id
@ -42,7 +42,6 @@ public class OrderLogisticsDTO implements Serializable {
/**
* 物流编号
*/
@NotNull
private String logisticsNo;
@Override
@ -61,7 +60,7 @@ public class OrderLogisticsDTO implements Serializable {
return id;
}
public OrderLogisticsDTO setId(Integer id) {
public OrderLogisticsUpdateDTO setId(Integer id) {
this.id = id;
return this;
}
@ -70,7 +69,7 @@ public class OrderLogisticsDTO implements Serializable {
return areaNo;
}
public OrderLogisticsDTO setAreaNo(String areaNo) {
public OrderLogisticsUpdateDTO setAreaNo(String areaNo) {
this.areaNo = areaNo;
return this;
}
@ -79,7 +78,7 @@ public class OrderLogisticsDTO implements Serializable {
return name;
}
public OrderLogisticsDTO setName(String name) {
public OrderLogisticsUpdateDTO setName(String name) {
this.name = name;
return this;
}
@ -88,7 +87,7 @@ public class OrderLogisticsDTO implements Serializable {
return mobile;
}
public OrderLogisticsDTO setMobile(String mobile) {
public OrderLogisticsUpdateDTO setMobile(String mobile) {
this.mobile = mobile;
return this;
}
@ -97,7 +96,7 @@ public class OrderLogisticsDTO implements Serializable {
return address;
}
public OrderLogisticsDTO setAddress(String address) {
public OrderLogisticsUpdateDTO setAddress(String address) {
this.address = address;
return this;
}
@ -106,7 +105,7 @@ public class OrderLogisticsDTO implements Serializable {
return logisticsNo;
}
public OrderLogisticsDTO setLogisticsNo(String logisticsNo) {
public OrderLogisticsUpdateDTO setLogisticsNo(String logisticsNo) {
this.logisticsNo = logisticsNo;
return this;
}

View File

@ -10,6 +10,7 @@ import java.util.Date;
* @time 2019-03-23 14:30
*/
public class OrderPageBO implements Serializable {
/**
* id
*/
@ -29,7 +30,7 @@ public class OrderPageBO implements Serializable {
/**
* 交易金额
*/
private Integer money;
private Integer price;
///
/// 时间信息
@ -77,18 +78,6 @@ public class OrderPageBO implements Serializable {
* 备注
*/
private String remark;
/**
* 创建时间
*/
private Date createTime;
/**
* 更新时间
*/
private Date updateTime;
/**
* 删除
*/
private Integer deleted;
@Override
public String toString() {
@ -97,7 +86,7 @@ public class OrderPageBO implements Serializable {
", userId=" + userId +
", orderLogisticsId=" + orderLogisticsId +
", orderNo='" + orderNo + '\'' +
", money=" + money +
", price=" + price +
", paymentTime=" + paymentTime +
", deliveryTime=" + deliveryTime +
", receiverTime=" + receiverTime +
@ -105,9 +94,6 @@ public class OrderPageBO implements Serializable {
", hasReturnExchange=" + hasReturnExchange +
", status=" + status +
", remark='" + remark + '\'' +
", createTime=" + createTime +
", updateTime=" + updateTime +
", deleted=" + deleted +
'}';
}
@ -147,12 +133,12 @@ public class OrderPageBO implements Serializable {
return this;
}
public Integer getMoney() {
return money;
public Integer getPrice() {
return price;
}
public OrderPageBO setMoney(Integer money) {
this.money = money;
public OrderPageBO setPrice(Integer price) {
this.price = price;
return this;
}
@ -218,31 +204,4 @@ public class OrderPageBO implements Serializable {
this.remark = remark;
return this;
}
public Date getCreateTime() {
return createTime;
}
public OrderPageBO setCreateTime(Date createTime) {
this.createTime = createTime;
return this;
}
public Date getUpdateTime() {
return updateTime;
}
public OrderPageBO setUpdateTime(Date updateTime) {
this.updateTime = updateTime;
return this;
}
public Integer getDeleted() {
return deleted;
}
public OrderPageBO setDeleted(Integer deleted) {
this.deleted = deleted;
return this;
}
}

View File

@ -24,6 +24,14 @@ public class OrderQueryDTO implements Serializable {
* 用户 id
*/
private Integer userId;
/**
* 物流id
*/
private Integer orderLogisticsId;
/**
* 是否退换货
*/
private Integer hasReturnExchange;
/**
* 付款时间待发货
*/
@ -38,10 +46,11 @@ public class OrderQueryDTO implements Serializable {
* 删除状态
*/
private Integer deleted;
@NotNull(message = "页码不能为空")
/**
* 状态
*/
private Integer status;
private Integer pageNo;
@NotNull(message = "每页条数不能为空")
private Integer pageSize;
@Override
@ -50,11 +59,14 @@ public class OrderQueryDTO implements Serializable {
"id=" + id +
", orderNo='" + orderNo + '\'' +
", userId=" + userId +
", orderLogisticsId=" + orderLogisticsId +
", hasReturnExchange=" + hasReturnExchange +
", startPaymentTime=" + startPaymentTime +
", endPaymentTime=" + endPaymentTime +
", startCreateTime=" + startCreateTime +
", endCreateTime=" + endCreateTime +
", deleted=" + deleted +
", status=" + status +
", pageNo=" + pageNo +
", pageSize=" + pageSize +
'}';
@ -87,6 +99,24 @@ public class OrderQueryDTO implements Serializable {
return this;
}
public Integer getOrderLogisticsId() {
return orderLogisticsId;
}
public OrderQueryDTO setOrderLogisticsId(Integer orderLogisticsId) {
this.orderLogisticsId = orderLogisticsId;
return this;
}
public Integer getHasReturnExchange() {
return hasReturnExchange;
}
public OrderQueryDTO setHasReturnExchange(Integer hasReturnExchange) {
this.hasReturnExchange = hasReturnExchange;
return this;
}
public Date getStartPaymentTime() {
return startPaymentTime;
}
@ -132,6 +162,15 @@ public class OrderQueryDTO implements Serializable {
return this;
}
public Integer getStatus() {
return status;
}
public OrderQueryDTO setStatus(Integer status) {
this.status = status;
return this;
}
public Integer getPageNo() {
return pageNo;
}

View File

@ -90,6 +90,12 @@
<version>1.0-SNAPSHOT</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>cn.iocoder.mall</groupId>
<artifactId>product-service-api</artifactId>
<version>1.0-SNAPSHOT</version>
<scope>compile</scope>
</dependency>
</dependencies>
<build>

View File

@ -1,4 +1,4 @@
package cn.iocoder.mall.order.convert;
package cn.iocoder.mall.order.application.convert;
import cn.iocoder.mall.order.api.dto.OrderPageBO;
import cn.iocoder.mall.order.dataobject.OrderDO;

View File

@ -1,4 +1,4 @@
package cn.iocoder.mall.order.convert;
package cn.iocoder.mall.order.application.convert;
import cn.iocoder.mall.order.api.dto.OrderCreateItemDTO;
import cn.iocoder.mall.order.api.dto.OrderItemUpdateDTO;

View File

@ -1,4 +1,4 @@
package cn.iocoder.mall.order.convert;
package cn.iocoder.mall.order.application.convert;
import cn.iocoder.mall.order.api.dto.OrderCreateDTO;
import cn.iocoder.mall.order.api.dto.OrderLogisticsUpdateDTO;

View File

@ -55,5 +55,5 @@ public interface OrderMapper {
* @param orderQueryDTO
* @return
*/
List<OrderDO> selectPage(OrderQueryDTO orderQueryDTO, int offset, int pageSize);
List<OrderDO> selectPage(OrderQueryDTO orderQueryDTO);
}

View File

@ -31,7 +31,7 @@ public class OrderDO extends DeletableDO {
/**
* 交易金额
*/
private Integer money;
private Integer price;
///
/// 时间信息
@ -87,7 +87,7 @@ public class OrderDO extends DeletableDO {
", userId=" + userId +
", orderLogisticsId=" + orderLogisticsId +
", orderNo='" + orderNo + '\'' +
", money=" + money +
", price=" + price +
", paymentTime=" + paymentTime +
", deliveryTime=" + deliveryTime +
", receiverTime=" + receiverTime +
@ -134,12 +134,12 @@ public class OrderDO extends DeletableDO {
return this;
}
public Integer getMoney() {
return money;
public Integer getPrice() {
return price;
}
public OrderDO setMoney(Integer money) {
this.money = money;
public OrderDO setPrice(Integer price) {
this.price = price;
return this;
}

View File

@ -0,0 +1,40 @@
package cn.iocoder.mall.order.mock;
import cn.iocoder.common.framework.vo.CommonResult;
import cn.iocoder.mall.product.api.ProductSpuService;
import cn.iocoder.mall.product.api.bo.ProductSpuDetailBO;
import cn.iocoder.mall.product.api.bo.ProductSpuPageBO;
import cn.iocoder.mall.product.api.dto.ProductSpuAddDTO;
import cn.iocoder.mall.product.api.dto.ProductSpuPageDTO;
import cn.iocoder.mall.product.api.dto.ProductSpuUpdateDTO;
/**
* @author Sin
* @time 2019-03-24 15:24
*/
public class ProductSpuServiceMock implements ProductSpuService {
@Override
public CommonResult<ProductSpuDetailBO> getProductSpu(Integer id) {
return null;
}
@Override
public CommonResult<ProductSpuDetailBO> addProductSpu(Integer adminId, ProductSpuAddDTO productSpuAddDTO) {
return null;
}
@Override
public CommonResult<Boolean> updateProductSpu(Integer adminId, ProductSpuUpdateDTO productSpuUpdateDTO) {
return null;
}
@Override
public CommonResult<Boolean> updateProductSpuSort(Integer adminId, Integer spuId, Integer sort) {
return null;
}
@Override
public CommonResult<ProductSpuPageBO> getProductSpuPage(ProductSpuPageDTO productSpuPageDTO) {
return null;
}
}

View File

@ -10,9 +10,9 @@ import cn.iocoder.mall.order.api.constant.OrderErrorCodeEnum;
import cn.iocoder.mall.order.api.constant.OrderHasReturnExchangeEnum;
import cn.iocoder.mall.order.api.constant.OrderStatusEnum;
import cn.iocoder.mall.order.api.dto.*;
import cn.iocoder.mall.order.convert.OrderConvert;
import cn.iocoder.mall.order.convert.OrderItemConvert;
import cn.iocoder.mall.order.convert.OrderLogisticsConvert;
import cn.iocoder.mall.order.application.convert.OrderConvert;
import cn.iocoder.mall.order.application.convert.OrderItemConvert;
import cn.iocoder.mall.order.application.convert.OrderLogisticsConvert;
import cn.iocoder.mall.order.dao.OrderItemMapper;
import cn.iocoder.mall.order.dao.OrderLogisticsMapper;
import cn.iocoder.mall.order.dao.OrderMapper;
@ -49,15 +49,12 @@ public class OrderServiceImpl implements OrderService {
@Override
public CommonResult<List<OrderPageBO>> getOrderPage(OrderQueryDTO orderQueryDTO) {
int offset = orderQueryDTO.getPageNo() * orderQueryDTO.getPageSize();
int pageSize = orderQueryDTO.getPageSize();
int totalCount = orderMapper.selectPageCount(orderQueryDTO);
if (totalCount == 0) {
return CommonResult.success(Collections.EMPTY_LIST);
}
List<OrderDO> orderDOList = orderMapper.selectPage(orderQueryDTO, offset, pageSize);
List<OrderDO> orderDOList = orderMapper.selectPage(orderQueryDTO);
List<OrderPageBO> orderPageBOList = OrderConvert.INSTANCE.convertPageBO(orderDOList);
return CommonResult.success(orderPageBOList);
}
@ -69,6 +66,23 @@ public class OrderServiceImpl implements OrderService {
OrderLogisticsDO orderLogisticsDO = OrderLogisticsConvert.INSTANCE.convert(orderCreateDTO);
List<OrderItemDO> orderItemDOList = OrderItemConvert.INSTANCE.convert(orderItemDTOList);
// TODO: 2019-03-24 sin 校验商品是否存在
// for (OrderItemDO orderItemDO : orderItemDOList) {
// CommonResult<ProductSpuDetailBO> result = productSpuService.getProductSpu(orderItemDO.getSkuId());
//
// // 有任何商品获取失败或者为 null都直接返回失败
// if (result.isError()) {
// return ServiceExceptionUtil.error(OrderErrorCodeEnum.ORDER_GET_SKU_FAIL.getCode());
// }
//
// if (result.getData() == null) {
// return ServiceExceptionUtil.error(OrderErrorCodeEnum.ORDER_GET_SKU_NOT_EXISTENT.getCode());
// }
//
// ProductSpuDetailBO spuDetailBO = result.getData();
// orderItemDO.setPrice(1000);
// }
// 物流信息
orderLogisticsDO
.setLogisticsNo("")
@ -81,7 +95,7 @@ public class OrderServiceImpl implements OrderService {
.setUserId(userId)
.setOrderLogisticsId(orderLogisticsDO.getId())
.setOrderNo(UUID.randomUUID().toString().replace("-", ""))
.setMoney(-1) // 先设置一个默认值金额在下面计算
.setPrice(-1) // 先设置一个默认值金额在下面计算
.setClosingTime(null)
.setDeliveryTime(null)
.setPaymentTime(null)
@ -119,7 +133,7 @@ public class OrderServiceImpl implements OrderService {
orderMapper.updateById(
new OrderDO()
.setId(orderDO.getId())
.setMoney(totalAmount)
.setPrice(totalAmount)
);
// TODO: 2019-03-17 Sin 需要发送 创建成果 MQ 消息
@ -128,7 +142,7 @@ public class OrderServiceImpl implements OrderService {
new OrderBO()
.setId(orderDO.getId())
.setOrderNo(orderDO.getOrderNo())
.setMoney(orderDO.getMoney())
.setMoney(orderDO.getPrice())
);
}
@ -136,6 +150,9 @@ public class OrderServiceImpl implements OrderService {
public CommonResult updateOrderItem(OrderItemUpdateDTO orderUpdateDTO) {
OrderItemDO orderItemDO = OrderItemConvert.INSTANCE.convert(orderUpdateDTO);
orderItemMapper.updateById(orderItemDO);
// TODO: 2019-03-24 sin 需要重新计算金额
// TODO: 2019-03-24 sin 需要记录日志
return CommonResult.success(null);
}
@ -169,7 +186,7 @@ public class OrderServiceImpl implements OrderService {
orderMapper.updateById(
new OrderDO()
.setId(orderId)
.setMoney(totalAmount)
.setPrice(totalAmount)
);
return CommonResult.success(null);
}

View File

@ -3,7 +3,7 @@
<mapper namespace="cn.iocoder.mall.order.dao.OrderMapper">
<sql id="FIELDS">
id, user_id, order_logistics_id, order_no, money, payment_time,
id, user_id, order_logistics_id, order_no, price, payment_time,
delivery_time, receiver_time, closing_time, has_return_exchange,
status, remark, create_time, update_time, `deleted`
</sql>
@ -13,12 +13,12 @@
-->
<insert id="insert" parameterType="OrderDO" useGeneratedKeys="true" keyColumn="id" keyProperty="id">
INSERT INTO `order` (
user_id, order_logistics_id, order_no, money, payment_time,
user_id, order_logistics_id, order_no, price, payment_time,
delivery_time, receiver_time, closing_time,
has_return_exchange, status, remark,
create_time, update_time, `deleted`
) VALUES (
#{orderLogisticsId}, #{userId}, #{orderNo}, #{money}, #{paymentTime},
#{orderLogisticsId}, #{userId}, #{orderNo}, #{price}, #{paymentTime},
#{deliveryTime}, #{receiverTime}, #{closingTime},
#{hasReturnExchange}, #{status}, #{remark},
#{createTime}, #{updateTime}, #{deleted}
@ -36,8 +36,8 @@
<if test="orderNo != null">
, order_no = #{orderNo}
</if>
<if test="money != null">
, money = #{money}
<if test="price != null">
, price = #{price}
</if>
-- time
<if test="paymentTime != null">
@ -97,22 +97,22 @@
查询条件
-->
<sql id="selectWhere">
<if test="id">
<if test="id != null">
AND `id` = #{id}
</if>
<if test="userId">
<if test="userId != null">
AND `user_id` = #{userId}
</if>
<if test="orderLogisticsId">
<if test="orderLogisticsId != null">
AND `order_logistics_id` = #{orderLogisticsId}
</if>
<if test="orderNo">
<if test="orderNo != null">
AND `order_no` = #{orderNo}
</if>
<if test="hasReturnExchange">
<if test="hasReturnExchange != null">
AND `has_return_exchange` = #{hasReturnExchange}
</if>
<if test="status">
<if test="status != null">
AND `status` = #{status}
</if>
</sql>
@ -124,7 +124,7 @@
SELECT
COUNT(*)
FROM `order`
WHERE
WHERE 1 = 1
<include refid="selectWhere" />
</select>
@ -135,9 +135,9 @@
SELECT
<include refid="FIELDS" />
FROM `order`
WHERE
WHERE 1 = 1
<include refid="selectWhere" />
LIMIT
LIMIT ${pageNo * pageSize}, ${pageSize}
</select>