Java使用MongoTemplate实现多条件、模糊查询、排序、范围、分页查询

2023-11-16

场景: 查询客户列表, 不同条件之间取交集(且的关系), 单个条件内取并集(或的关系)

实现细节如下:

1. 全等于 (手机号全字匹配)

2. 模糊查询 (客户名称模糊搜索)

3. 单个条件查询多个字段 (客户编号)

4. 日期范围 (近期消费时间)

5. 数值范围 (消费总金额)

6. 数组字段满足任一 (来源平台、下单店铺)

7. 数组字段满足全部 (客户标签)

8. 查询返回指定字段 (自定义列表)

9. 排除指定字段 (自定义列表)

10. 分页

11. 排序

12. 总记录数


提示:以下是本篇文章正文内容,下面案例可供参考

一、前端查询条件入参实体类

/**
 * 查询客户列表信息条件
 *
 * @author xiaoyj
 * @date 2022-07-01
 */

@Data
@ApiModel("查询客户列表信息条件")
public class ClientBasicInfoBO {

    /**
     * 客户名称
     */
    @ApiModelProperty(value = "客户名称")
    private String name;

    /**
     * ADMP客户ID
     */
    @ApiModelProperty(value = "ADMP客户ID")
    private String admpId;

    /**
     * 企业微信id
     */
    private String wechatId;

    /**
     * 企微手机号
     */
    @ApiModelProperty(value = "企微手机号")
    private String mobile;

    /**
     * 收货手机号
     */
    @ApiModelProperty(value = "收货手机号")
    private String receiverMobile;

    /**
     * 企微绑定状态
     */
    @ApiModelProperty(value = "企微绑定状态")
    private String bindStatus;

    /**
     * 企微留存状态
     */
    @ApiModelProperty(value = "企微留存状态")
    private String retentionStatus;

    /**
     * 客户标签
     */
    @ApiModelProperty(value = "客户标签")
    private Long[] admpLabels;

    /**
     * 标签范围
     */
    @ApiModelProperty(value = "标签范围: 任一 any ,全部 all")
    private String tagScope;

    /**
     * 店铺id
     */
    @ApiModelProperty(value = "店铺id")
    private String[] shopIds;

    /**
     * 最近消费开始时间
     */
    @ApiModelProperty(value = "最近消费开始时间")
    private String recentlyBuyBeginTime;

    /**
     * 最近消费结束时间
     */
    @ApiModelProperty(value = "最近消费结束时间")
    private String recentlyBuyEndTime;

    /**
     * 最低消费总金额
     */
    @ApiModelProperty(value = "最低消费总金额")
    private Double lowestTotalBuyAmount;

    /**
     * 最高消费总金额
     */
    @ApiModelProperty(value = "最高消费总金额")
    private Double highestTotalBuyAmount;

    /**
     * 最小消费次数
     */
    @ApiModelProperty(value = "最小消费次数")
    private Integer minTotalBuyTimes;

    /**
     * 最多消费次数
     */
    @ApiModelProperty(value = "最大消费次数")
    private Integer maxTotalBuyTimes;

    /**
     * 收货省份
     */
    @ApiModelProperty(value = "收货省份")
    private String[] receiverProvince;

    /**
     * 收货城市
     */
    @ApiModelProperty(value = "收货城市")
    private String[] receiverCity;

    /**
     * 平台类型
     */
    @ApiModelProperty(value = "平台类型")
    private Integer[] platformTypes;

    /**
     * 收货区县
     */
    @ApiModelProperty(value = "收货区县")
    private String[] receiverDistrict;

    /**
     * 自定义列
     */
    @ApiModelProperty(value = "自定义列")
    private List <String> customColumn;

    /**
     * 分页大小
     */
    @ApiModelProperty(value = "分页大小")
    private Integer pageSize;

    /**
     * 当前页数
     */
    @ApiModelProperty(value = "当前页数")
    private Integer pageNum;
}

二、实现类中使用mongoTemplate构造查询条件

// 创建条件对象
Criteria criteria = new Criteria();
// 3. 单个条件查询多个字段 (客户编号)
if (StringUtils.isNotEmpty(bo.getAdmpId())) {
    criteria.orOperator(
            Criteria.where("final_uid").is(bo.getAdmpId()),
            Criteria.where("customer_ids").in(bo.getAdmpId()),
            Criteria.where("official_ids").in(bo.getAdmpId()),
            Criteria.where("tb_ids").in(bo.getAdmpId()),
            Criteria.where("jd_ids").in(bo.getAdmpId()),
            Criteria.where("yz_ids").in(bo.getAdmpId()),
            Criteria.where("wm_ids").in(bo.getAdmpId()),
            Criteria.where("dd_ids").in(bo.getAdmpId()),
            Criteria.where("ks_ids").in(bo.getAdmpId())
    );
}
// 2. 模糊查询 (客户名称模糊搜索)
if (StringUtils.isNotBlank(bo.getName())) {
    criteria.and("name").regex(Pattern.compile("^.*" + bo.getName() + ".*$", Pattern.CASE_INSENSITIVE));
}
// 1. 全等于 (手机号全字匹配)
if (StringUtils.isNotBlank(bo.getMobile())) {
    criteria.and("mobile").is(bo.getMobile());
}
if (StringUtils.isNotBlank(bo.getBindStatus())) {
    criteria.and("bind_status").is(bo.getBindStatus());
}
if (StringUtils.isNotBlank(bo.getRetentionStatus())) {
    criteria.and("retention_status").is(bo.getRetentionStatus());
}
// 4. 日期范围 (近期消费时间)
if (StringUtils.isNotEmpty(bo.getRecentlyBuyBeginTime()) && StringUtils.isNotEmpty(bo.getRecentlyBuyEndTime())) {
    criteria.andOperator(Criteria.where("recently_buy_time").gte(bo.getRecentlyBuyBeginTime()), Criteria.where("recently_buy_time").lte(bo.getRecentlyBuyEndTime()));
}
if (StringUtils.isNotNull(bo.getLowestTotalBuyAmount()) && StringUtils.isNotNull(bo.getHighestTotalBuyAmount())) {
    criteria.and("total_buy_amount").gte(bo.getLowestTotalBuyAmount()).lte(bo.getHighestTotalBuyAmount());
}
if (StringUtils.isNotNull(bo.getLowestTotalBuyAmount()) && StringUtils.isNull(bo.getHighestTotalBuyAmount())) {
    criteria.and("total_buy_amount").gte(bo.getLowestTotalBuyAmount());
}
if (StringUtils.isNull(bo.getLowestTotalBuyAmount()) && StringUtils.isNotNull(bo.getHighestTotalBuyAmount())) {
    criteria.and("total_buy_amount").lte(bo.getHighestTotalBuyAmount());
}
// 5. 数值范围 (消费总金额)
if (StringUtils.isNotNull(bo.getMinTotalBuyTimes()) && StringUtils.isNotNull(bo.getMaxTotalBuyTimes())) {
    criteria.and("total_buy_count").gte(bo.getMinTotalBuyTimes()).lte(bo.getMaxTotalBuyTimes());
}
if (StringUtils.isNotNull(bo.getMinTotalBuyTimes()) && StringUtils.isNull(bo.getMaxTotalBuyTimes())) {
    criteria.and("total_buy_count").gte(bo.getMinTotalBuyTimes());
}
if (StringUtils.isNull(bo.getMinTotalBuyTimes()) && StringUtils.isNotNull(bo.getMaxTotalBuyTimes())) {
    criteria.and("total_buy_count").lte(bo.getMaxTotalBuyTimes());
}
if (!CollectionUtils.isEmpty(Arrays.asList(bo.getAdmpLabels()))) {
    if ("all".equals(bo.getTagScope())) {
        //  7. 数组字段满足全部 (客户标签)
        criteria.and("admp_labels").all(bo.getAdmpLabels());
    } else if ("any".equals(bo.getTagScope())) {
        criteria.and("admp_labels").in(bo.getAdmpLabels());
    }
}
if (StringUtils.isNotEmpty(bo.getReceiverMobile())) {
    criteria.and("receiver_mobiles").in(bo.getReceiverMobile());
}
// 6. 数组字段满足任一 (来源平台、下单店铺)
if (StringUtils.isNotNull(bo.getPlatformTypes()) && bo.getPlatformTypes().length > 0) {
    criteria.and("source_codes").in(bo.getPlatformTypes());
}
if (StringUtils.isNotNull(bo.getShopIds()) && bo.getShopIds().length > 0) {
    criteria.and("shop_ids").in(bo.getShopIds());
}
if (StringUtils.isNotNull(bo.getReceiverProvince()) && bo.getReceiverProvince().length > 0) {
    criteria.and("receiver_provinces").in(bo.getReceiverProvince());
}
if (StringUtils.isNotNull(bo.getReceiverCity()) && bo.getReceiverCity().length > 0) {
    criteria.and("receiver_cities").in(bo.getReceiverCity());
}
if (StringUtils.isNotNull(bo.getReceiverDistrict()) && bo.getReceiverDistrict().length > 0) {
    criteria.and("receiver_districts").in(bo.getReceiverDistrict());
}
Query query = new Query();
query.addCriteria(criteria);
// 12. 总记录数
long total = mongoTemplate.count(query, ClientBasicInfoDO.class);
// 8. 查询返回指定字段 (自定义列表)
query.fields().include("final_uid", "name", "wechat_id", "mobile", "u_id", "retention_status", "tb_ids", "jd_ids", "yz_ids", "tb_ids", "wm_ids", "dd_ids", "ks_ids");
// 10. 分页
query.with(PageRequest.of(bo.getPageNum() - 1, bo.getPageSize(), 
// 11. 排序
Sort.by(Sort.Order.desc("earliest_add_time"))));
// 执行查询
List<ClientBasicInfoDO> list = mongoTemplate.find(query, ClientBasicInfoDO.class);

三、测试效果

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

Java使用MongoTemplate实现多条件、模糊查询、排序、范围、分页查询 的相关文章

随机推荐

  • 学习HTML:iframe用法总结收藏

    原文地址 http blog csdn net andycode article details 6899775 分类 html js css 8 Html代码 p 是框架的一种形式 也比较常用到 p
  • Open3d之计算源点云与目标云的距离

    核心函数介绍 compute point cloud distance 提供了计算从源点云到目标点云的距离的方法 即 它计算源点云中的每个点到目标点云中最近点的距离 在下面的例子中 展示了使用该函数来计算两点云之间的差值 请注意 此方法也可
  • Shiro反序列化漏洞利用——2、Shiro_exploit漏洞检测

    使用Shiro exploit工具 检查是否存在默认的key 1 Github项目地址 下载利用工具 https github com insightglacier Shiro exploit 2 1使用示例 python shiro ex
  • C语言学习之assert

    C语言学习之assert C语言学习之assert assert 编程术语 编写代码时 我们总是会做出一些假设 断言就是用于在代码中捕捉这些假设 可以将断言看作是异常处理的一种高级形式 断言表示为一些布尔表达式 程序员相信在程序中的某个特定
  • 【C】变量

    目录 变量的命名 局部变量 全局变量 作用域 生命周期 变量的命名 变量名必须是由字母 数字 下划线组成 不能以数字开头 变量名不能是关键字 局部变量 全局变量
  • 斗地主2.0

    案例介绍 按照斗地主的规则 完成洗牌发牌的动作 具体规则 组装54张扑克牌将 54张牌顺序打乱 三个玩家参与游戏 三人交替摸牌 每人17张牌 最后三张留作底牌 查看三人各自手中的牌 按照牌的大小排序 底牌 规则 手中扑克牌从大到小的摆放顺序
  • git 主干master分支回滚到历史版本

    先切换到主分支 然后执行以下两点 1 回滚到指定版本 本地分支回滚到指定版本 git reset hard
  • 【漏洞复现】CVE-2022-44268 ImageMagick任意文件读取漏洞

    启动环境 sudo docker compose up d 查看端口号 服务启动后 访问http your ip 8080可以看到图片上传框 利用这个漏洞 需要先准备一个恶意PNG文件 文件内容中包含我们准备读取的文件路径 可以使用poc
  • 计算机网络--第三章思维导图

  • document.referrer的用法

    在JavaScript中 document对象有很多属性 其中有3个与对网页的请求有关的属性 它们分别是URL domain和referrer URL属性包含页面完整的URL domain属性中只包含页面的域名 而referrer属性中则保
  • 【模型评估与选择】sklearn.model_selection.train_test_split

    1 描述 Split arrays or matrices into random train and test subsets 2 语法 train test split arrays options 3 参数 1 arrays sequ
  • 多版本php安装swoole失败问题

    问题描述 使用命令 pecl安装报错 查看报错提示使用的是低版本的php 问题原因 pecl设置的环境变量指向的路径是低版本的所以如果想使用高版本的php 需要使用全路径命令 解决方法 usr local php7 26 bin pecl
  • Ubuntu 安装elasticsearch集群

    环境准备 准备三台服务器搭建集群环境 node1 192 168 177 171 node2 192 168 177 172 node3 192 168 177 173 其中node1为master节点 node2 node3为slave节
  • 图像分割汇总

    Image Segmentation 图像分割 所谓图像分割是指根据灰度 彩色 空间纹理 几何形状等特征把图像划分成若干个互不相交的区域 使得这些特征在同一区域内表现出一致性或相似性 而在不同区域间表现出明显的不同 简单的说就是在一副图像中
  • Python——遗传算法简介及其在二次分配中的运用(含详细源代码)

    一 遗传算法简介 二 二次分配问题描述 三 Python代码实现 import math import random import matplotlib pyplot as plt def getPermutation n x n为全排列的
  • 集训第一周 Linux

    1 创建一个用户user1 用root身份给user1修改密码为redhat 提示 创建用户用useradd user1 2 切换到user1用户 给自己修改一个密码 密码任意 3 在 root 目录中创建一个以自己的汉语拼音为名字的文件
  • QML学习一:QtCreator编译器主题背景设置

    效果如下 QML学习一 QtCreator编译器主题背景设置 前言 一 工具栏菜单栏背景设置 二 文本编辑区域设置 总结 前言 工欲善其事必先利其器 为了更好地开发代码 我们先将QtCreator界面改为模仿Vs2019主题样式 这样开发起
  • Unity3d中所有特殊的文件夹

    1 Editor Editor文件夹可以在根目录下 也可以在子目录里 只要名子叫Editor就可以 比如目录 xxx xxx Editor 和 Editor 是一样的 无论多少个叫Editor的文件夹都可以 Editor下面放的所有资源文件
  • svn清理本地已经删除的文件,注意事项

    点击项目目录下空白处点击trotoiseSVN后点击检查修改 在里面删除你想要删除的已删除文件即可 分支操作注意事项 在切换分支前记得提交本地代码的修改 否则会合并到切换后的分支去 切记 哎
  • Java使用MongoTemplate实现多条件、模糊查询、排序、范围、分页查询

    场景 查询客户列表 不同条件之间取交集 且的关系 单个条件内取并集 或的关系 实现细节如下 1 全等于 手机号全字匹配 2 模糊查询 客户名称模糊搜索 3 单个条件查询多个字段 客户编号 4 日期范围 近期消费时间 5 数值范围 消费总金额