【技术碎片】【PostgreSQL】Mybatis-Plus多值模糊查询sql语句,order by多个字段排序与优先级

发布于:2023-09-14 ⋅ 阅读:(255) ⋅ 点赞:(0)

在这里插入图片描述

order by多个字段排序与优先级

有数据表如下:

在这里插入图片描述
假设有业务需求需要对查询结果进行多字段排序,比如对id和update_time需要降序排序,并且优先保证id的降序,其次再保证update_time的降序。

我们执行:

SELECT id, username, passwd, enabled, account_non_expired, account_non_locked, credentials_non_expired, is_deleted, create_time, create_user, update_time, update_user
FROM test.image_management_user
order by id, update_time desc
;

有结果如下:

在这里插入图片描述

可以看到id并没有降序排序,并且update_time也没有降序排序。

那是不是字段顺序问题,调转id 和 update_time的顺序查询:

SELECT id, username, passwd, enabled, account_non_expired, account_non_locked, credentials_non_expired, is_deleted, create_time, create_user, update_time, update_user
FROM test.image_management_user
order by update_time, id desc
;

可以发现结果也不对

在这里插入图片描述

可以发现,如果使用语句

SELECT id, username, passwd, enabled, account_non_expired, account_non_locked, credentials_non_expired, is_deleted, create_time, create_user, update_time, update_user
FROM test.image_management_user
order by update_time, id desc
;

则实际上是将查询结果按照update_time做升序,再对id做降序,并且以update_time升序为优先,也就是说desc只对它修饰的id字段生效,所以如果对多个字段排序,需要多次使用desc/asc来修饰多个字段,正确解决需求的语句如下:

SELECT id, username, passwd, enabled, account_non_expired, account_non_locked, credentials_non_expired, is_deleted, create_time, create_user, update_time, update_user
FROM test.image_management_user
order by id desc, update_time desc
;

结果为:
在这里插入图片描述

可以看到查询结果以id降序为有限,其次保证update_time的降序。

Mybatis-Plus多值模糊查询sql语句

有时候需要多个值在单个字段上进行模糊查询,比如对用户名user_name 字段中搜索包含,或,或的用户名,mysql中有

SELECT * FROM public.table WHERE user_name REGEXP '张|李|赵';

假设通过List<String>传到后端,请求体对象为input,则利用mybatis-plus我们可以实现多值模糊查询sql语句:


        // 多值模糊查询sql语句
        List<String> keyWords = input.getKeyWords();
        String sql = "user_name REGEXP ";
        if (!CollectionUtil.isEmpty(keyWords)) {
            StringBuilder sqlBuilder = new StringBuilder();
            sqlBuilder.append("'");
            for (String keyWord : keyWords) {
                sqlBuilder.append(keyWord).append("|");
            }
            sqlBuilder.deleteCharAt(sqlBuilder.length() - 1).append("'");;
            sql += sqlBuilder.toString();
        }

        // 数据库分页查询 - apply将sql语句应用
        Page<User> selectOutputPage = userInfoMapper.selectPage(
                new Page<>(input.getPageNo(), input.getPageSize()),
                Wrappers.lambdaQuery(User.class)
                .eq(User::getIsDeleted, Boolean.FALSE)
                .in(!input.getUserTypes().isEmpty(), User::getUserType, input.getUserTypes())
                .apply(sql)
        );
        

这里多值查询是或逻辑。

也可以通过 .and() 加lambda表达式实现,这里多值查询是与逻辑。

        // 数据库分页查询
        List<String> finalNameKeyWords = nameKeyWords;
        Page<CommonModelLabel> commonModelLabelPage = commonModelLabelMapper.selectPage(
                new Page<>(parameter.getPageNo(), parameter.getPageSize()),
                Wrappers.lambdaQuery(User.class)
                .eq(User::getIsDeleted, Boolean.FALSE)
                .in(!input.getUserTypes().isEmpty(), User::getUserType, input.getUserTypes())
                .and(!ObjectUtil.isEmpty(finalNameKeyWords), wq -> {
                    for (String finalNameKeyWord : finalNameKeyWords) {
                        wq.like(CommonModelLabel::getLabelName, finalNameKeyWord);
                    }
                })
        );

改成.or()就是或逻辑

        // 数据库分页查询
        List<String> finalNameKeyWords = nameKeyWords;
        Page<CommonModelLabel> commonModelLabelPage = commonModelLabelMapper.selectPage(
                new Page<>(parameter.getPageNo(), parameter.getPageSize()),
                Wrappers.lambdaQuery(User.class)
                .eq(User::getIsDeleted, Boolean.FALSE)
                .in(!input.getUserTypes().isEmpty(), User::getUserType, input.getUserTypes())
                .or(!ObjectUtil.isEmpty(finalNameKeyWords), wq -> {
                    for (String finalNameKeyWord : finalNameKeyWords) {
                        wq.like(CommonModelLabel::getLabelName, finalNameKeyWord);
                    }
                })
        );


网站公告

今日签到

点亮在社区的每一天
去签到