前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >mybatis-plus过滤不需要查询的字段

mybatis-plus过滤不需要查询的字段

作者头像
阿超
发布2022-08-17 20:43:48
2.6K0
发布2022-08-17 20:43:48
举报
文章被收录于专栏:快乐阿超快乐阿超

仁义忠信,乐善不倦,此天爵也 。一一孟子

之前写过过滤出需要查询的字段,也简单介绍了下Mybatis-Plusselect函数

今天写了个小函数,可以直接传入不需要查询出来的字段

代码语言:javascript
复制
/**
 * 过滤不需要查询的字段
 *
 * @param wrapper   条件构造器
 * @param functions 字段
 * @return com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper<T>
 * @author <achao1441470436@gmail.com>
 * @since 2021/10/12 15:51
 */
@SafeVarargs
public static <T> LambdaQueryWrapper<T> filterProperties(LambdaQueryWrapper<T> wrapper, SFunction<T, Serializable>... functions) {
    return Optional.ofNullable(functions).filter(ArrayUtils::isNotEmpty).map(array -> Arrays.stream(array).map(LambdaUtils::resolve).map(SerializedLambda::getImplMethodName).map(PropertyNamer::methodToProperty).collect(Collectors.toList())).map(properties -> wrapper.select(i -> !properties.contains(i.getProperty()))).orElse(wrapper);
}

使用方式:

代码语言:javascript
复制
LambdaQueryWrapper<Product> wrapper = new LambdaQueryWrapper<>(new Product());
MybatisPlusUtils.filterProperties(wrapper, Product::getDetail, Product::getParams)

或者直接

代码语言:javascript
复制
LambdaQueryWrapper<Product> lambdaQueryWrapper = MybatisPlusUtils.filterProperties(new LambdaQueryWrapper<>(new Product()), Product::getDetail, Product::getParams);

注意,LambdaQueryWrapper需要使用带实体的有参构造

image-20211012201649609
image-20211012201649609

当然也可以不用,我们只需要稍作修改:

代码语言:javascript
复制
/**
 * 过滤不需要查询的字段
 *
 * @param wrapper   条件构造器
 * @param functions 字段
 * @return com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper<T>
 * @author <achao1441470436@gmail.com>
 * @since 2021/10/12 15:51
 */
@SafeVarargs
@SuppressWarnings("unchecked")
public static <T> LambdaQueryWrapper<T> filterProperties(LambdaQueryWrapper<T> wrapper, SFunction<T, Serializable>... functions) {
    Set<SerializedLambda> lambdas = Optional.ofNullable(functions).filter(ArrayUtils::isNotEmpty).map(array -> Arrays.stream(array).map(LambdaUtils::resolve).collect(Collectors.toSet())).orElseGet(Collections::emptySet);
    Set<String> properties = lambdas.stream().map(SerializedLambda::getImplMethodName).map(PropertyNamer::methodToProperty).collect(Collectors.toSet());
    lambdas.stream().findAny().ifPresent(lam -> wrapper.select((Class<T>) lam.getImplClass(), i -> !properties.contains(i.getProperty())));
    return wrapper;
}

这样就可以不用使用带实体的有参构造啦

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2021-10-12,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档