Mybatis-Plus复杂语句多级嵌套分组带分页查询

2023-10-27

如 :

SELECT dbname FROM (

SELECT CONCAT(db_type,'-',table_name) as dbname FROM `mdn_table_permission` WHERE (db_type = 'MYSQL') ORDER BY create_time ASC

) as q GROUP BY dbname LIMIT 1

这样的语句是用条件构造器很难实现的,故用注解形式:

通过 QueryWrapper来拼接需要查询的参数: ${ew.customSqlSegment}进行注入

第一步:
 QueryWrapper<TablePermission> qw = new QueryWrapper<>();
qw.eq(StrUtil.isNotEmpty(dbType), TablePermission.DB_TYPE, dbType);
qw.like(StrUtil.isNotEmpty(tableName), TablePermission.TABLE_NAME, tableName);
qw.like(StrUtil.isNotEmpty(userName), TablePermission.USER_NAME, userName);
qw.select("CONCAT(db_type,'-',table_name) as dbname");
qw.orderByAsc(TablePermission.CREATE_TIME);

//第二步:
Page<TablePermission> pages = new Page<>(ePage, pageSize);
Page<String> lsit = baseMapper.lsitsss(pages,qw);
//第三步mapper写法:
@Select("SELECT dbname FROM (SELECT CONCAT(db_type,'-',table_name) as dbname FROM `mdn_table_permission` ${ew.customSqlSegment}) as q GROUP BY dbname")
Page<String> lsitsss(@Param("page")Page<TablePermission> page,@Param(Constants.WRAPPER) Wrapper wrapper);

官网网址

条件构造器 | MyBatis-Plus

函数名

说明

示例

allEq

全部eq(或个别isNull)

例1: allEq({id:1,name:"老王",age:null})

        --->id = 1 and name = '老王' and age is null

例2: allEq({id:1,name:"老王",age:null}, false)

        --->id = 1 and name = '老王'

eq

等于 =

例eq("name", "老王")--->name = '老王'

ne

不等于 <>

例: ne("name", "老王")--->name <> '老王'

ge

大于 >

例: gt("age", 18)--->age > 18

ge

大于等于 >=

例: ge("age", 18)--->age >= 18

lt

小于 <

例: lt("age", 18)--->age < 18

lt

小于 <

例: lt("age", 18)--->age < 18

between

BETWEEN 值1 AND 值2

例: between("age", 18, 30)--->age between 18 and 30

notBetween

NOT BETWEEN 值1 AND 值2

例: notBetween("age", 18, 30)--->age not between 18 and 30

like

LIKE '%值%'

例: like("name", "王")--->name like '%王%'

notLike

NOT LIKE '%值%'

例: notLike("name", "王")--->name not like '%王%'

likeLeft

LIKE '%值'

例: likeLeft("name", "王")--->name like '%王'

likeRight

LIKE '值%'

例: likeRight("name", "王")--->name like '王%'

isNull

字段 IS NULL

例: isNull("name")--->name is null

isNotNull

字段 IS NOT NULL

例: isNotNull("name")--->name is not null

in

字段 IN (value.get(0), value.get(1), ...)

字段 IN (v0, v1, ...)

例: in("age",{1,2,3})--->age in (1,2,3)

例: in("age", 1, 2, 3)--->age in (1,2,3)

notIn

字段 NOT IN (value.get(0), value.get(1), ...)

字段 NOT IN (v0, v1, ...)

例:  notIn("age",{1,2,3})--->age not in (1,2,3)

例: notIn("age", 1, 2, 3)--->age not in (1,2,3)

inSql

字段 IN ( sql语句 )

例: inSql("age", "1,2,3,4,5,6")

        --->age in (1,2,3,4,5,6)

例: inSql("id", "select id from table where id < 3")

        --->id in (select id from table where id < 3)

notInSql

字段 NOT IN ( sql语句 )

例: notInSql("age", "1,2,3,4,5,6")

        --->age not in (1,2,3,4,5,6)

例: notInSql("id", "select id from table where id < 3")

        --->id not in (select id from table where id < 3)

groupBy

分组:GROUP BY 字段, ...

例: groupBy("id", "name")--->group by id,name

orderByAsc

排序:ORDER BY 字段, ... ASC

例: orderByAsc("id", "name")--->order by id ASC,name ASC

orderByDesc

排序:ORDER BY 字段, ... DESC

例: orderByDesc("id", "name")--->order by id DESC,name DESC

orderBy

排序:ORDER BY 字段, ...

例: orderBy(true, true, "id", "name")--->order by id ASC,name ASC

having

HAVING ( sql语句 )

例: having("sum(age) > 10")--->having sum(age) > 10

例: having("sum(age) > {0}", 11)--->having sum(age) > 11

func

func 方法(主要方便在出现if...else下调用不同方法能不断链)

例: func(i -> if(true) {i.eq("id", 1)} else {i.ne("id", 1)})

or

拼接 OR。

主动调用or表示紧接着下一个方法不是用and连接!(不调用or则默认为使用and连接)

例: eq("id",1).or().eq("name","老王")

        --->id = 1 or name = '老王'

例: or(i -> i.eq("name", "李白").ne("status", "活着"))

        --->or (name = '李白' and status <> '活着')

and

AND 嵌套

例: and(i -> i.eq("name", "李白").ne("status", "活着"))

        --->and (name = '李白' and status <> '活着')

nested

正常嵌套 不带 AND 或者 OR

例: nested(i -> i.eq("name", "张三").gt("age", 25))
        --->(name = '张三' and age > 25)

例:

.eq("name", "李四")
.nested(i -> i.gt("age", 25).or().lt("age", 12))
.eq("email", "abc@qq.com")
        --->name = '李四" AND (age > 25 OR age < 12) AND email = "abc@qq.com"

apply

拼接 sql。

该方法可用于数据库函数动态入参的params对应前面applySql内部的{index}部分。这样是不会有sql注入风险的,反之会有!

例: apply("id = 1")

        --->id = 1

例: apply("date_format(dateColumn,'%Y-%m-%d') = '2008-08-08'")

        --->date_format(dateColumn,'%Y-%m-%d') = '2008-08-08'")

例: apply("date_format(dateColumn,'%Y-%m-%d') = {0}", "2008-08-08")

        --->date_format(dateColumn,'%Y-%m-%d') = '2008-08-08'")

last

无视优化规则直接拼接到 sql 的最后。

只能调用一次,多次调用以最后一次为准。有sql注入的风险,请谨慎使用

例: last("limit 1")

exists

拼接 EXISTS ( sql语句 )

例: exists("select id from table where age = 1")

--->exists (select id from table where age = 1)

notExists

拼接 NOT EXISTS ( sql语句 )

例: notExists("select id from table where age = 1")

--->not exists (select id from table where age = 1)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Mybatis-Plus复杂语句多级嵌套分组带分页查询 的相关文章

  • 无法使用 Django 应用程序从容器连接到 MySQL docker 容器

    当我尝试从运行 Django 应用程序的 docker 容器连接到运行 MySQL 的容器时 出现以下错误 django db utils OperationalError 2003 Can t connect to MySQL serve
  • C#:SQL 查询生成器类

    在哪里可以找到好的 SQL 查询构建器类 我只需要一个简单的类来构建 SQL 字符串 仅此而已 我需要它用于 C 和 MySql 我真的不需要像 Linq 或 NHibernate 这样的东西 谢谢 由于 Google 将我引导至此页面 我
  • MySQL+子串怎么做? + 替换?

    我不太擅长 SQL 希望能够变得更好 我在尝试执行某些表操作时遇到一些麻烦 我希望能够从下面的 ProgUID 列中选择子字符串 就像是 SUBSTRING table ProgUID 3 12 这将为我提供 ProgUID P CAMVE
  • PHP PDO相关:更新SQL语句未更新数据库内容

    我正在尝试使用准备好的语句来实现更新语句PHP http en wikipedia org wiki PHP脚本 但它似乎没有更新数据库中的记录 我不确定为什么 所以如果您能分享一些见解 我将不胜感激 Code query UPDATE D
  • 将记录分成两列

    我的数据库中有一个 学生 表 其中包含大约 5 000 条记录 我想将这些记录显示在two分区 如何在不执行查询两次的情况下做到这一点 仅使用单个查询 显示示例http www freeimagehosting net uploads f1
  • ActiveRecord3死锁重试

    Rails 3 或 ActiveRecord 3 是否有任何插件可以复制旧版本死锁重试 http agilewebdevelopment com plugins deadlock retry插入 或者 该插件仍然适用于 Rails 3 吗
  • 对于数据库来说,选择正确的数据类型会影响性能吗?

    如果是这样 为什么 我的意思是 tinyint 的搜索速度比 int 快吗 如果是这样 性能上的实际差异是什么 是的 根据数据类型 它确实有所不同 int vs tinyint不会在速度上产生明显的差异 但会在数据大小上产生差异 假设tin
  • 使 pdo::query 静态

    当我运行下面的代码时出现此错误 我通常使用 msql 函数 但我尝试使用 PDO 代替 怎么了 致命错误 第 14 行无法静态调用非静态方法 PDO query
  • 如何在 Laravel 查询中使用多个 OR,AND 条件

    我需要 Laravel 查询帮助 我的自定义查询 返回正确结果 Select FROM events WHERE status 0 AND type public or type private 如何写这个查询Laravel Event w
  • 阻止注销页面后的后退按钮

    我有 php 注销页面 当用户单击注销链接时 请参阅此页面并重定向到索引页面 但是当单击后退按钮时 我会看到带有用户数据的上一页 当然 当我刷新页面时 我看不到以前的页面和数据 我在单击注销并单击后退按钮后检查了其他代码 drupal 但我
  • 第三个下拉菜单不从数据库填充

    我有以下 Index php
  • 为什么我的 if 语句没有按我预期的方式工作?

    我正在尝试实现以下目标 我向我的 SQL 数据库询问使用SELECT FROM subjects 这样做之后我要求使用数组mysqli fetch assoc 在那之前一切都很好 现在的问题是 当我尝试在每个循环中修改 genero 的值
  • 如何在Sequelize中设置查询超时?

    我想看看如何在 Sequelize 中设置查询的超时时间 我查看了 Sequelize 文档以获取一些信息 但我找不到我要找的东西 我发现的最接近的是 pools acquire 选项 但我不想设置传入连接的超时 而是设置正在进行的查询的超
  • Mysql 中 UNION 子句的替代方案

    我有两张桌子 表 a 表 b table a ID 1 2 3 4 5 7 table b ID 2 3 4 5 6 我必须得到这样的输出而无需UNION命令 ID 1 2 3 4 5 6 7 注意 我有一个联合解决方案 select fr
  • 忽略重复条目并在 EF Core 中的 DbContext.SaveChanges() 上提交成功条目

    我有一个 ASP Net Core 2 2 Web API 在我的一个控制器操作中 我向 MySQL 数据库表添加了一堆行 我使用的是 Pomelo 例如 dbContext AddRange entities dbContext Save
  • MySQL连接字符集问题

    我在 Mac 上使用带有 MySQL 的 velosurf 没有任何编码问题 但是当我切换到 Linux 计算机时 从 velosurf 获得的值未正确编码 我发现这可能是默认连接字符集的问题 在 Mac 上我得到 mysql gt sho
  • 在服务器上找不到本地主机或 phpMyAdmin:如何修复?

    我按照安装说明进行操作PHP MySQL and PHPMyAdmin 但是当我尝试访问时http localhost phpmyadmin 我收到此错误 未找到 在此找不到请求的 URL phpmyadmin 服务器 然后我尝试访问loc
  • 如何将ElasticSearch与MySQL集成?

    在我的一个项目中 我计划将 ElasticSearch 与 MySQL 结合使用 我已经成功安装ElasticSearch 我可以单独管理ES中的索引 但我不知道如何用 MySQL 实现同样的功能 我读过一些文件 但我有点困惑 没有明确的想
  • Bugzilla 中分离客户端的基本权限

    我正在尝试配置一个 Bugzilla 实例 这将允许我的客户登录并为其正在开发 维护的网站提交错误 例如 我创建了 2 个名为 TestProject TestProject2 的产品和一个名为 TestClient 的用户 我想要实现的是
  • 如何在 Play java 中创建数据库线程池并使用该池进行数据库查询

    我目前正在使用 play java 并使用默认线程池进行数据库查询 但了解使用数据库线程池进行数据库查询可以使我的系统更加高效 目前我的代码是 import play libs Akka import scala concurrent Ex

随机推荐

  • 十一、kotlin的协程 - 缓存、volatile、内存屏障和cas(四) --- 跑题篇

    本章写着写着就跑题了 又不舍得删除 新手看 协程的共享变量安全问题简单入门和 volatile 不保证原子性部分代码 其他可以不看 太乱 也没用 协程的共享变量安全问题简单入门 在使用 kotlin 的协程库中 我们会看到很多的 协程调度器
  • UVALive 6258 Non-boring sequences

    Problem icpcarchive ecs baylor edu index php option com onlinejudge Itemid 8 page show problem problem 4269 vjudge net c
  • 《代码之道》勘误表(2008.12.31更新)

    页码 行号 2009年1月第1版译文 建议的修正 备注 III 3 事物的本源以及行事之道 玄之又玄的背后终是一个个自圆其说的预言 这确是任何组织发展趋势的终结所在 关于世界应该是什么样子或者事情应该怎样去做的神话 最后证明都是一个个自圆其
  • c——顺序结构

    顺序结构 1 赋值语句 2 数据的输出 3 数据的输入 4 复合语句与空语句 4 1 复合语句 4 2 空语句 5 程序实例 1 赋值语句 在赋值表达式的后面加上 分号 就构成了赋值语句 2 数据的输出 字符原样输出 指定宽度输出 如果长度
  • java静态程序PPT_java中的static

    学习本文你到底要学到什么 1 static在java中到底代表什么 为何要用它 2 static在java中怎么用 3 static有那些特点和使用的 局限 1 static在java中到底代表什么 为何要用它 static 静态 指定位置
  • Linux下创建进程简介

    在博文https blog csdn net fengbingchun article details 108940548中简单介绍了Windows下通过函数CreateProcess创建进程的过程 这里简单介绍下Linux下通过fork函
  • 目标检测(Object Detection)原理与实现(五)

    基于Cascade分类器的目标检测 从今天开始进入基于机器学习的目标检测 前几节虽然也接触了一些机器学习的方法 但它主要是做辅助工作 机器学习的方法和非机器学习的方法结合在一起使用 说到这想起来前几天看到一位博士师兄发的笑话 说的是百度实验
  • 算法练习-NOJ-1005-装载问题

    时限 1000ms 内存限制 10000K 总时限 3000ms 描述 有两艘船 载重量分别是c1 c2 n个集装箱 重量是wi i 1 n 且所有集装箱的总重量不超过c1 c2 确定是否有可能将所有集装箱全部装入两艘船 输入 多个测例 每
  • outlook搜索栏跑到上面去了_工具方法

    我想这点文字主要对于研究生 或经常收发邮件的人比较有意义 可以帮助您 不会错过重要人物的信件 不会错过重要的日程安排 不会错过你关心领域的第一手资讯 如果你平时办公学习基本不使用邮件 那这篇文字对你没什么作用 就不用浪费时间阅读 当然 你也
  • Singleton单例模式-【懒汉式-加双重校验锁&防止指令重排序的懒汉式】实现方案中为什么需要加volatile关键字

    前提知识点 volatile可以保证可见性 防止指令重排序 synchronized可以保证可见性 防止指令重排序 原子性 也即是说volatile是synchronized的功能子集 我们知道在 懒汉式 加双重校验锁 的单例模式实现中已经
  • SSM项目打包到本地MAVEN仓库

  • redis哨兵模式原理

    阅读目录 redis哨兵模式架构 哨兵模式工作原理 哨兵如何判断master宕机 故障转移过程 主节点写压力过大 集群脑裂 主从数据不一致 总结 概述 为了实现redis集群的高可用 redis经历了好几次迭代 从最开始的主从模式 到哨兵模
  • 服务器发送了一个意外的数据包。received:3,expected:20“问题的解决方法

    XShell连接ssh服务器时提示这个 同事的没有问题 经过比对 我的是xshell5 0版本 同事的是6 0版本 升级xshell解决问题
  • C++友元函数,友元类

    友元函数 友元函数是在C 中用来访问另一个类的私有成员的一种机制 通过将函数声明为友元函数 可以使该函数能够访问类中的私有成员 即使它不是类的成员函数或者成员 在类的声明中声明友元函数 将友元函数的原型放在类的声明中 并在函数原型前加上fr
  • 静态代理

    一 静态代理概念 代理模式 目标对象类型的变量指向代理对象 然后调用方法的时候会执行代理对象的方法 代理对象的方法里面重写或者调用了目标对象的方法 并且在方法执行前后添加了一些功能 静态代理 写好对应的代理类源文件 在编译期就已经确定了目标
  • 微搭低代码学习之数据收集

    低代码和开发之间的关系 低代码平台是一种快速构建应用程序的工具 旨在提高开发效率 它们提供了一种基于图形用户界面的方式来创建应用程序 而无需编写大量的代码 使用低代码平台 开发人员可以更快速地构建和交付应用程序 从而缩短开发周期 然而 低代
  • 反向读取文件的每一行

    反向读取文件的每一行 作者 大矩阵作坊 加入时间 2004 02 19 浏览次数 100 有的初学者可能会尝试写一些文本数据的程序 并把每一条记录存为一行 如留言本 写入数据时 可能会把新添加的数据加入文件未尾 但是读文件并输出时 会发现也
  • Python中常用内置函数学习

    Python中的各个函数集合 时刻补充中 一 range函数 函数原型 range start end scan 参数含义 start 计数从start开始 默认是从0开始 例如range 5 等价于range 0 5 end 计数到end
  • 解决element-ui/element-plus中el-pagination分页组件显示英文

    解决element ui element plus中el pagination分页组件显示英文 解决方法 在main js或main ts中引入中文语言 import locale from element plus lib locale
  • Mybatis-Plus复杂语句多级嵌套分组带分页查询

    如 SELECT dbname FROM SELECT CONCAT db type table name as dbname FROM mdn table permission WHERE db type MYSQL ORDER BY c