• 记录一次Mongotemplate的And和Or的各种套


    需求是查询用户的行程安排信息
    查询用户过去七天到未来的行程安排,
    也就是说数据必须满足如下条件
    1.见面时间 >= 当前时间-7天
    2.用户id=发送者id,且发送人确认情况=0或者=null
    或者用户id=接收者,且发送人确认情况=0或者=null
    以上两个表示用户没有确认或者否认这个记录,所以进行展示
    3.行程必须是被同意过的
    4.行程必须是未见面的
    5.指定用户


    mysql大概的写法

    select
    *
    from table
    where 
    isConsent = 1
    and
    isMeet = 0
    and
    userId = xxxxxxxxx
    and meetime > 当前时间减7and
    (
    	userId = recId and (recConfirm = 0 or recConfirm = null)
    	or
    	userId = senId and (senConfirm = 0 or recConfirm = null)
    )
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    用mongoTemplate的写法

    /**
     * 查询用户所有有效的未取消的见面行程,并按见面时间升序ASC
     *
     * @param userId
     * @return
     */
    @Override
    public PageResult<Meeting> getMeetingSchedule(Integer page, Integer limit, Long userId) {
        LocalDateTime min = LocalDateTime.of(LocalDate.now(), LocalTime.MIN);
        Long sevenDaysAgo = AdTimeUtils.getMills(min.plusDays(-7));
        // 创建条件
        Criteria criteria = new Criteria();
        // 启用or运算符,之中只要一条满足就为true则命中
        criteria.orOperator(
                // 满足条件1
                Criteria.where("sendUserId").is(userId)
                        // 满足条件1的情况下启用or运算符,其中只要一条满足即为true,配合上面的where即为更上层的true
                        .orOperator(
                                Criteria.where("senderConfirm").is(MeetingEnum.UN_MEET.getCode()),
                                Criteria.where("senderConfirm").is(null)
                        )
                ,
                Criteria.where("recUserId").is(userId)
                        .orOperator(
                                Criteria.where("recipientConfirm").is(MeetingEnum.UN_MEET.getCode()),
                                Criteria.where("recipientConfirm").is(null)
                        )
        );
        // 启用and运算符,其中条件都满足即为选中
        criteria.andOperator(
                Criteria.where("isConsent").is(MeetingEnum.IS_CONSENT.getCode()),
                Criteria.where("isMeet").is(MeetingEnum.UN_MEET.getCode()),
                Criteria.where("meetTime").gte(sevenDaysAgo)
        );
        Query query = new Query(criteria);
        query.skip((page - 1) * limit).limit(limit)
                .with(Sort.by(Sort.Order.asc("meetTime")));
        List<Meeting> meetings = mongoTemplate.find(query, Meeting.class);
        if (CollUtil.isEmpty(meetings)) {
            return new PageResult<>(
                    false,
                    CodeEnum.NO_SCHEDULE.getCode());
        }
        //到这就是查到了需要的行程数据,封装返回
        return new PageResult<>(true, page, limit,
                CodeEnum.SELECT_SUCCESS.getCode(), meetings);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47

    orOperator以及andOperator
    都相当于开启了一个and (判断) 当里面的||或者&&满足时这个为true,则命中,嵌套的情况下亦是如此,整体如果判断为true,但是上层有其他的嵌套,则加入他们的判断;

  • 相关阅读:
    lua 如何在嵌入式Linux中与c语言结合
    【初试396分】西北工业大学827学长经验分享
    超详细的Linux环境如何搭建禅道
    【hexo】butterfly主题魔改之天气插件
    如何选择高频器件功分器和耦合器的PCB材料
    Mybatis自定义类型映射处理器
    在服务器上搭建Cadence16.6 CIS共享库
    数字孪生与GIS的完美融合
    云表低代码开发平台赋能仓储管理,助力企业高效增长
    基于微信平台的牙科就诊信息管理系统的设计与实现 毕业设计-附源码211157
  • 原文地址:https://blog.csdn.net/m0_49194578/article/details/125410495