MyBatis-plus聚合查询、表关联、条件更新实践
更新时间:2026年05月15日 09:59:08 作者:zhengxianyi515
文章描述了一个图书馆系统的操作流程,首先查询预约数量,其次关联查询可预约书籍并发出通知,最后更新书刊状态为下架,输出每步操作的SQL日志
1、聚合查询
统计预约数量,返回数量 > 0的记录:
QueryWrapper<BookArangeDO> arangeQuery = new QueryWrapper<BookArangeDO>()
.eq("status", "1")
.in("book_no", bookNoList)
.select("book_no", "count(book_no) as arange_count")
.groupBy("book_no").having("arange_count > {0}", 0)
;
List<Map<String, Object>> mapList = bookArangeMapper.selectMaps(arangeQuery);
Map<String, Integer> countMap = new HashMap<>();
mapList.forEach(bookArangeDO -> {
countMap.put(bookArangeDO.get("book_no").toString(), Integer.valueOf(bookArangeDO.get("arange_count").toString()));
});输出查询sql日志
SELECT book_no, count(book_no) AS arange_count FROM bl_book_arange WHERE deleted = 0 AND (status = ? AND book_no IN (?, ?)) AND tenant_id = 1 GROUP BY book_no HAVING arange_count > ?
2、表关联查询
预约表BookArange关联复本表BookCopy,查询可以预约的书籍,逐个发出预约取书通知。
MPJLambdaWrapperX<BookArangeDO> queryWrapperX = new MPJLambdaWrapperX<>();
queryWrapperX
.select(BookArangeDO::getBookNo, BookArangeDO::getTenantId)
.leftJoin(BookCopyDO.class, BookCopyDO::getBookNo, BookArangeDO::getBookNo)
.eq(BookCopyDO::getStatus, "3") // 可借阅
.eq(BookArangeDO::getStatus, "1") // 预约中
;
Page<Map<String, Object>> page = new Page<>(1, 10);
page = bookArangeMapper.selectJoinMapsPage(page, queryWrapperX);输出查询sql日志
SELECT t.book_no,t.tenant_id FROM bl_book_arange t LEFT JOIN bl_book_copy t1 ON (t1.book_no = t.book_no) WHERE t.deleted=0 AND t1.deleted=0 AND (t1.status = ? AND t.status = ?)
3、条件更新
书刊下架,将已归还、可借阅状态的书刊状态更新为已下架状态。
LambdaUpdateWrapper<BookCopyDO> updateWrapper = new LambdaUpdateWrapper<>();
updateWrapper.in(BookCopyDO::getBookNo, bookNos)
.in(BookCopyDO::getStatus, "6", "3") // 已归还、可借阅
.set(BookCopyDO::getTakeupId, SecurityFrameworkUtils.getLoginUserId())
.set(BookCopyDO::getStatus, '7'); // 已下架
int n = bookCopyMapper.update(updateWrapper);
if(n !=bookNos.length) {
throw new ServiceException("下架失败,请检查书刊条码、上架状态");
}输出查询sql日志
UPDATE bl_book_copy SET takeup_id = ?, status = ? WHERE deleted = 0 AND (book_no IN (?) AND status IN (?, ?)) AND tenant_id = 1
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。
相关文章
浅谈升级Spring Cloud到Finchley后的一点坑
这篇文章主要介绍了浅谈升级Spring Cloud到Finchley后的一点坑,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧2018-10-10
浅谈javaSE 面向对象(Object类toString)
下面小编就为大家带来一篇浅谈javaSE 面向对象(Object类toString)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧2016-06-06
spring-boot-plus V1.4.0发布 集成用户角色权限部门管理(推荐)
这篇文章主要介绍了spring-boot-plus V1.4.0发布 集成用户角色权限部门管理,本文给大家介绍的非常详细,具有一定的参考借鉴价值需要的朋友可以参考下2019-11-11
Java Mybatis中的 ${ } 和 #{ }的区别使用详解
这篇文章主要介绍了Mybatis中的 ${ } 和 #{ }的区别使用详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧2020-07-07


最新评论