nested 嵌套SQL

注意:本教程使用的数据库脚本、数据模型和环境信息请参考 “MyBatis Plus环境准备” 章节,点击下载示例源码

本章节将介绍使用 nested() 方法添加嵌套 SQL,方法定义如下:

nested(Consumer<Param> consumer)
nested(boolean condition, Consumer<Param> consumer)

参数说明:

  • consumer:构造内嵌SQL条件

  • condition:用于指定当前这个条件是否有效;如果为 true,则应用当前条件;如果为 false,则忽略当前条件。

实例:查询所有姓黄,性别为男,年龄大于 30,薪水大于 9000 的用户信息,如下:

QueryWrapper<UserBean> wrapper = new QueryWrapper<>();
wrapper.likeRight("name", "黄");
wrapper.nested(new Consumer<QueryWrapper<UserBean>>() {
    @Override
    public void accept(QueryWrapper<UserBean> userBeanQueryWrapper) {
        userBeanQueryWrapper.eq("sex", "男")
                .gt("age", 30).gt("salary", 9000);
    }
});

上面查询条件将拼接出如下 SQL 语句:

SELECT user_id,name,sex,age,face,salary,borthday 
FROM user 
WHERE (name LIKE ? AND (sex = ? AND age > ? AND salary > ?))

可以看到嵌套 SQL 语句就是在 where 子句中添加一个括号“()”,即“(sex = ? AND age > ? AND salary > ?)”。

示例代码

package com.hxstrive.mybatis_plus.simple_mapper.condition;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.hxstrive.mybatis_plus.mapper.SimpleMapper;
import com.hxstrive.mybatis_plus.model.UserBean;
import org.junit.jupiter.api.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
import java.util.List;
import java.util.function.Consumer;

@RunWith(SpringRunner.class)
@SpringBootTest
class Condition16Test {

    @Autowired
    private SimpleMapper simpleMapper;

    @Test
    void contextLoads() {
        QueryWrapper<UserBean> wrapper = new QueryWrapper<>();
        wrapper.likeRight("name", "黄");
        wrapper.nested(new Consumer<QueryWrapper<UserBean>>() {
            @Override
            public void accept(QueryWrapper<UserBean> userBeanQueryWrapper) {
                userBeanQueryWrapper.eq("sex", "男")
                        .gt("age", 30).gt("salary", 9000);
            }
        });

        List<UserBean> userBeanList = simpleMapper.selectList(wrapper);
        System.out.println("result size=" + userBeanList.size());
    }

}

运行上面代码,实际上将执行下面 SQL 语句:

Preparing: SELECT user_id,name,sex,age,face,salary,borthday FROM user WHERE (name LIKE ? AND (sex = ? AND age > ? AND salary > ?))
Parameters: 黄%(String), 男(String), 30(Integer), 9000(Integer)

说说我的看法
全部评论(
没有评论
关于
本网站专注于 Java、数据库(MySQL、Oracle)、Linux、软件架构及大数据等多领域技术知识分享。涵盖丰富的原创与精选技术文章,助力技术传播与交流。无论是技术新手渴望入门,还是资深开发者寻求进阶,这里都能为您提供深度见解与实用经验,让复杂编码变得轻松易懂,携手共赴技术提升新高度。如有侵权,请来信告知:hxstrive@outlook.com
公众号