NipGeihou's blog NipGeihou's blog
  • Java

    • 开发规范
    • 进阶笔记
    • 微服务
    • 快速开始
    • 设计模式
  • 其他

    • Golang
    • Python
    • Drat
  • Redis
  • MongoDB
  • 数据结构与算法
  • 计算机网络
  • 应用

    • Grafana
    • Prometheus
  • 容器与编排

    • KubeSphere
    • Kubernetes
    • Docker Compose
    • Docker
  • 组网

    • TailScale
    • WireGuard
  • 密码生成器
  • 英文单词生成器
🍳烹饪
🧑‍💻关于
  • 分类
  • 标签
  • 归档

NipGeihou

我见青山多妩媚,料青山见我应如是
  • Java

    • 开发规范
    • 进阶笔记
    • 微服务
    • 快速开始
    • 设计模式
  • 其他

    • Golang
    • Python
    • Drat
  • Redis
  • MongoDB
  • 数据结构与算法
  • 计算机网络
  • 应用

    • Grafana
    • Prometheus
  • 容器与编排

    • KubeSphere
    • Kubernetes
    • Docker Compose
    • Docker
  • 组网

    • TailScale
    • WireGuard
  • 密码生成器
  • 英文单词生成器
🍳烹饪
🧑‍💻关于
  • 分类
  • 标签
  • 归档
  • 设计模式

  • 开发规范

  • 经验分享

    • MyBatis-Plus查询条件构造器扩展——QueryWrapperX
      • 扩展初衷
      • 环境
    • 浅谈MVC分层及层对象传递实践
    • Spring Boot中Service需要声明接口吗
    • Java日志类
    • 派单算法
    • AI探店视频技术分析
  • 记录

  • 快速开始

  • 笔记

  • 面试题

  • 微服务

  • 踩过的坑

  • Java
  • 经验分享
NipGeihou
2022-01-08
目录

MyBatis-Plus查询条件构造器扩展——QueryWrapperX

弃用

在对开发流程的进一步学习后,本人认为下面的扩展并不见得是一个很好的做法。不应该使用过多的关联,过多的关联会导致笛卡尔积的膨胀,导致查询效率降低。

  • 可以考虑先查询出 A 表对象,拷贝到 AVo 对象,再使用 in 查询 B 对象,再组装到 AVo 中。
  • 在必须多联表查询的场景中,可以考虑使用视图。

# 扩展初衷

MP 的条件构造器能让我在开发中不必在 XML 中编写大量的非空判断,使得常用的 CRUD 功能变得高效。但有这么一种场景,MP 似乎不支持:

假设我现在有一张学生表 student ,我需要返回给前端时携带 班级名称 字段,而 student 表中只有 clazz_id 字段,需要关联班级表 clazz 获取,查询条件还是 student 表的字段,但 MP 并不能很好的处理这件事情。

<select id="selectListStudentVO" resultType="cn.nipx.school.vo.StudentVO">
    SELECT s.*,c.name AS clazz_name
    FROM student AS s
    INNER JOIN clazz AS c ON s.clazz_id = c.id
    ${ew.customSqlSegment}
</select>

由 MyBatis-Plus - 使用 Wrapper 自定义 SQL (opens new window) 可知:

使用 ${ew.customSqlSegment} 不支持 Wrapper 内的 entity 生成 where 语句

因此在 Service 层中不能再使用以下写法

// controller传递查询条件studentVO
LambdaQueryWrapper<StudentVO> queryWrapper = new LambdaQueryWrapper<>(studentVO);
return this.list(queryWrapper);

而是需要手动构建 Wrapper

LambdaQueryWrapper<StudentVO> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(StudentVO::getName, studentVO.getName());
queryWrapper.eq(StudentVO::getClazzId, studentVO.getClazzId());
return this.list(queryWrapper);

而这样又有另一个问题了,因为 name 字段在 student 表和 clazz 表都有,而生成的 sql 中条件 name 是没有加别名的,MySQL 也就不知道 name 指的是哪个,从而报错。

# 环境

todo

上次更新: 2023/02/07, 20:10:39
MQ规范
浅谈MVC分层及层对象传递实践

← MQ规范 浅谈MVC分层及层对象传递实践→

最近更新
01
Docker Swarm
04-18
02
安全隧道 - gost
04-17
03
Solana最佳实践
04-16
更多文章>
Theme by Vdoing | Copyright © 2018-2025 NipGeihou | 友情链接
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式