前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >传入对象进行多条件查询——by QueryWrapper && 反射

传入对象进行多条件查询——by QueryWrapper && 反射

原创
作者头像
凡尘扰凡心
发布2024-08-26 16:33:21
720
发布2024-08-26 16:33:21
举报
文章被收录于专栏:默认分类
代码语言:txt
复制
@Data
public class SearchServerDto implements Serializable {

    private Long serverid;

    private String host;

    private String nickname;

    private Date createtime;
}

若前端传入该对象,想通过该对象进行搜索按条件搜索

如果采用传统的方法,进行每一个属性都进行判断则需要很多的if else if

但如果采用反射和注解的思想将减少繁琐的步骤,且具有通用性

分析:

作者使用的是Mybatis-X生成的实体类

有注解@TableId、@TableField,故新添了一个注解来做分辨

代码语言:txt
复制
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface FieldAnnoation {
    String Annoationtype() default "TableField";
}

可以使用反射,动态的将SearchServerDto注入到QueryWrapper 中

代码语言:txt
复制




  QueryWrapper<UserServer> queryWrapper = new QueryWrapper<>();
        UserServer userServer = new UserServer();
        List<UserServer> list;
        if (ObjectUtils.isEmpty(searchServerDto)){
             list = userServerService.list();


        }else{
            Class<? extends SearchServerDto> searchServerDtoClass = searchServerDto.getClass();
            Class<? extends UserServer> userServerClass = userServer.getClass();
            
            Field[] fields = userServerClass.getDeclaredFields();//获取实体类字节码对象的private属性
            for (Field f:fields
                 ) {
                FieldAnnoation fieldAnnoation = f.getAnnotation(FieldAnnoation.class);//获取属性上的自定义注解
                if (!ObjectUtils.isEmpty(fieldAnnoation)){
                    String annoationtype = fieldAnnoation.Annoationtype();
                    if (annoationtype.equals("TableField")){//判断该注解的类型
                        TableField tableField = f.getAnnotation(TableField.class);//获取TableField注解上的数据库表的名称
                        Field declaredField = searchServerDtoClass.getDeclaredField(f.getName());//获取searchServerDto的属性
                        declaredField.setAccessible(true);//设置可访问该属性
                        Object o = declaredField.get(searchServerDto);//获取searchServerDto对象的属性值
                        if (!ObjectUtils.isEmpty(o)){
                            queryWrapper.eq(tableField.value(),o);
                        }
                    }else{
                        TableId tableId = f.getAnnotation(TableId.class);
                        Field field = searchServerDtoClass.getDeclaredField(f.getName());
                        field.setAccessible(true);
                        Object o = field.get(searchServerDto);
                        if (!ObjectUtils.isEmpty(o)){
                            queryWrapper.eq(tableId.value(),o);
                        }

                    }
                }

            }


            list = userServerService.list(queryWrapper);


        }
        return Result.success(list);

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

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

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
数据库
云数据库为企业提供了完善的关系型数据库、非关系型数据库、分析型数据库和数据库生态工具。您可以通过产品选择和组合搭建,轻松实现高可靠、高可用性、高性能等数据库需求。云数据库服务也可大幅减少您的运维工作量,更专注于业务发展,让企业一站式享受数据上云及分布式架构的技术红利!
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档