一、Mybatisplus連表分頁查詢
Mybatis-plus是一個Mybatis的增強工具,提供了許多功能強大的API,其中包括分頁查詢和多表關聯查詢。
在Mybatis-plus中,連表查詢可以使用LambdaQueryWrapper或QueryWrapper加入多個表進行查詢,然後再使用IPage進行分頁。
下面是一個示例代碼:
IPage<Map<String, Object>> page = new Page<>(pageNum, pageSize); LambdaQueryWrapper<Order> wrapper = new QueryWrapper<>().lambda(); wrapper.eq(Order::getUserId, userId) .eq(Order::getStatus, status) .select(Order::getId, Order::getOrderNo, Order::getCreateTime, Order::getStatus) .orderByDesc(Order::getCreateTime); IPage<Map<String, Object>> orderPage = orderService.pageMaps(page, wrapper);
二、Mybatisplus多表關聯查詢參數
Mybatis-plus的多表關聯查詢的參數,可以使用LambdaQueryWrapper或QueryWrapper加入多個表查詢條件,並使用Join方法進行關聯。也可以使用wrapper.select()方法指定需要查詢的欄位,並使用SelectJoinTableInfo解決列名衝突問題。
下面是一個示例代碼:
// 使用wrapper.select進行列名映射,解決列名衝突問題 LambdaQueryWrapper<Order> wrapper = new QueryWrapper<>().lambda(); wrapper.eq(Order::getUserId, userId) .eq(Order::getStatus, status) .select(Order::getId, Order::getOrderNo, Order::getCreateTime, Order::getStatus, Sqls.custom().and("(user.`name`) as userName")); wrapper.last("LEFT JOIN user on order.user_id = user.id"); wrapper.orderByDesc(Order::getCreateTime); // 進行關聯查詢 IPage<Map<String, Object>> orderPage = orderService.pageMaps(page, wrapper);
三、Mybatisplus多表分頁查詢怎麼用
Mybatis-plus多表分頁查詢需要使用IPage進行分頁,每個表都需要有唯一的查詢條件欄位,通常是表的主鍵。同時,每個表的查詢結果需要使用alias()方法為分頁結果進行別名映射。
下面是一個示例代碼:
// 使用wrapper.select別名解決列名衝突 LambdaQueryWrapper<Order> wrapper = new QueryWrapper<>().lambda(); wrapper.eq(Order::getUserId, userId) .eq(Order::getStatus, status) .select(Order::getId().as("id"), Order::getOrderNo().as("orderNo"), Order::getCreateTime().as("createTime"), Order::getStatus().as("status")); wrapper.orderByDesc(Order::getCreateTime()); // 使用IPage進行分頁 IPage<Map<String, Object>> page = new Page<>(pageNum, pageSize); IPage<Map<String, Object>> orderPage = orderService.pageMaps(page, wrapper); // 別名映射 List<Map<String, Object>> records = orderPage.getRecords(); for (Map<String, Object> record : records) { record.put("order_id", record.get("id")); record.put("order_no", record.get("orderNo")); record.put("create_time", record.remove("createTime")); record.put("status", record.get("status")); }
四、Mybatisplus多表聯查結果分頁選取
在Mybatis-plus多表聯查的結果中,需要進行結果的分頁選取,通常可以在查詢語句中直接進行分頁。
下面是一個示例代碼:
// 使用wrapper.last進行分頁 LambdaQueryWrapper<Order> wrapper = new QueryWrapper<>().lambda(); wrapper.eq(Order::getUserId, userId) .eq(Order::getStatus, status) .select(Order::getId().as("id"), Order::getOrderNo().as("orderNo"), Order::getCreateTime().as("createTime"), Order::getStatus().as("status")); wrapper.last("LIMIT " + (pageNum - 1) * pageSize + "," + pageSize); // 執行查詢 List<Map<String, Object>> orders = orderService.listMaps(wrapper);
五、Mybatisplus多表分頁
Mybatis-plus多表分頁需要進行多次查詢,因為Mybatis-plus分頁的實現是在查詢結果中進行截取的。首先需要查詢符合查詢條件的所有記錄,並記錄查詢結果的總數。然後再按照分頁條件進行截取,得到分頁的記錄。
下面是一個示例代碼:
// 查詢符合條件的所有訂單 LambdaQueryWrapper<Order> countWrapper = new QueryWrapper<>().lambda(); countWrapper.eq(Order::getUserId, userId) .eq(Order::getStatus, status); long count = orderService.count(countWrapper); // 計算分頁參數 int offset = (pageNum - 1) * pageSize; int limit = pageSize; // 分頁查詢 LambdaQueryWrapper<Order> pageWrapper = new QueryWrapper<>().lambda(); pageWrapper.eq(Order::getUserId, userId) .eq(Order::getStatus, status) .select(Order::getId().as("id"), Order::getOrderNo().as("orderNo"), Order::getCreateTime().as("createTime"), Order::getStatus().as("status")); pageWrapper.last("LIMIT " + offset + "," + limit); List<Map<String, Object>> orders = orderService.listMaps(pageWrapper); // 別名映射 for (Map<String, Object> order : orders) { order.put("order_id", order.get("id")); order.put("order_no", order.get("orderNo")); order.put("create_time", order.remove("createTime")); order.put("status", order.get("status")); } // 分頁結果封裝 IPage<Map<String, Object>> orderPage = new Page<>(pageNum, pageSize); orderPage.setRecords(orders); orderPage.setTotal(count);
結語
以上是Mybatisplus分頁多表關聯查詢的一些方法和技巧,掌握這些方法可以讓我們在多表關聯查詢和分頁查詢時更加輕鬆自如。
原創文章,作者:AOFA,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/138596.html