精华内容
下载资源
问答
  • 2022-05-06 08:14:16

    问题描述

    例如:多表连接查询时 没有添加查询条件时会导致 order by 不生效

    解决方案:

    	QueryWrapper.eq("1",1);#添加默认查询 1=1
    
    更多相关内容
  • 主要介绍了mybatis-plus QueryWrapper自定义查询条件的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
  • 记录querywrapper多表联查

    千次阅读 2022-03-30 16:37:51
    参数时可以在业务层进行参数判断: ... queryWrapper.like(true, "engine", servicesInfoParam.getEngine()); } if (StringUtils.isNotBlank(servicesInfoParam.getCrtTime())) { String[] timeSplit =

    多参数时可以在业务层进行参数判断:

     if (servicesInfoParam.getEngine() != null) {
                queryWrapper.like(true, "engine", servicesInfoParam.getEngine());
            }
            if (StringUtils.isNotBlank(servicesInfoParam.getCrtTime())) {
                String[] timeSplit = servicesInfoParam.getCrtTime().split("~");
                queryWrapper.between(true, "create_time", timeSplit[0].concat(" 00:00:00"), timeSplit[1].concat(" 23:59:59"));
            }
            if (StringUtils.isNotBlank(servicesInfoParam.getName())) {
                queryWrapper.like(true, "name", servicesInfoParam.getName());
            }
            if (servicesInfoParam.getType() != null) {
                queryWrapper.like(true, "type", servicesInfoParam.getType());
            }
            if (StringUtils.isNotBlank(servicesInfoParam.getStatus())) {
                queryWrapper.like(true, "status", servicesInfoParam.getStatus());
            }
            if (servicesInfoParam.getIsRelease() != null) {
                queryWrapper.like(true, "is_release", servicesInfoParam.getIsRelease());
            }
            if (ServicesOrderByEnum.CREATE_ASC.getValue().equals(servicesInfoParam.getSort())) {
                queryWrapper.orderByAsc("create_time");
            } else if (ServicesOrderByEnum.PRE_ASC.getValue().equals(servicesInfoParam.getSort())) {
                queryWrapper.orderByAsc("previewTimes");
            } else if (ServicesOrderByEnum.PRE_DESC.getValue().equals(servicesInfoParam.getSort())) {
                queryWrapper.orderByDesc("previewTimes");
            } else {
                queryWrapper.orderByDesc("create_time");
            }

    其中,如果参数是数据库表结构中字段,判断时写法需与数据库字段一致,如上图status、name、creat_time等,如参数是经过查询后处理重命名的(select......from  AS previewTimes),需与重命名后一致,如previewTimes。

    DAO层中需加入“ew”参数,如下:

    Page<ServicesInfoVo> queryByCondition(@Param("page") Page page, @Param("ew") QueryWrapper queryWrapper);

    Mapper.xml文件中查询语句后加上:${ew.customSqlSegment}

    展开全文
  • 重点:@Param("ew") Wrapper参数是必须,因为${ew.customSqlSegment} 底层其实就是where 条件,所以为了保证Wrapper不为空,service层代码中的Wrapper至少需要有一个条件:1 = 1 @Override @Select("select a....

    版权声明:请勿用于任何商业用途的文章转载,转载请说明出处!

    1.dao层接口使用Select注解写SQL:

    重点:@Param("ew") Wrapper参数是必须,因为${ew.customSqlSegment} 底层其实就是where 条件,所以为了保证Wrapper不为空,service层代码中的Wrapper至少需要有一个条件:1 = 1

    @Override
        @Select("select a.code as code , b.name as name , b.barcode as barcode ,  a.ware_code as wareCode , c.name as wareName , a.qty as qty , a.oprice as oprice , a.total as total , " +
                " a.id as id , a.create_by as createBy , a.create_date as createDate , a.update_by as updateBy , a.update_date as updateDate , a.status as status , a.remarks as remarks  " +
                "from sku_stock a , goods b , warehouse c " +
                "${ew.customSqlSegment} and a.code = b.code and a.ware_code = c.code")
        IPage<SkuStock> selectPage(IPage<SkuStock> page, @Param("ew")Wrapper<SkuStock> queryWrapper);

    2.service层代码示例:

    service父类封装的findPage方法

    /**
         * 封装findPage
         * @param entity
         * @param search  Map中的key:";"为保留关键字,拆分数组,仅支持最大长度2的数组,
         *                下标0:QueryWrapper查询条件中的列名(支持多表关联查询的表别名 + 列名方式,需要dao层接口支持)
         *                下标1: QueryWrapper中不同的查询条件,eq:等于,ge:大于等..... todo:请自行完善Mybatis eq、ne、gt、lt、ge、le等
         *                Map中的value:QueryWrapper需要查询的值
         * @param args  QueryWrapper中order by 排序数组
         * @return
         */
        public IPage<T> findPage(T entity , Map<String , Object> search , String... args){
            long current = 1L;
            long size = 10L;
            if (EmptyUtil.isNoEmpty(ReflexUtil.getFieldValue(entity , "page")) && (long) ReflexUtil.getFieldValue(entity , "page") != 0){
                current = (long) ReflexUtil.getFieldValue(entity , "page");
            }
            if (EmptyUtil.isNoEmpty(ReflexUtil.getFieldValue(entity , "limit")) && (long) ReflexUtil.getFieldValue(entity , "limit") != 0){
                size = (long) ReflexUtil.getFieldValue(entity , "limit");
            }
    
            QueryWrapper<T> queryWrapper;
            if (EmptyUtil.isNoEmpty(search)){
                queryWrapper = new QueryWrapper<>();
                for (Map.Entry<String , Object> entry:search.entrySet()
                     ) {
                    String[] key = entry.getKey().split(";");
                    if (key.length > 1){
                        if (key[1].equals("eq")){
                            queryWrapper.eq(key[0] , entry.getValue());
                        }else if (key[1].equals("ge")){
                            queryWrapper.ge(key[0] , entry.getValue());
                        }else if (key[1].equals("lt")){
                            queryWrapper.lt(key[0] , entry.getValue());
                        }
                    }else {
                        queryWrapper.like(entry.getKey() , entry.getValue());
                    }
                }
            }else {
                queryWrapper = new QueryWrapper<>(entity);
            }
            queryWrapper.orderByAsc(args);
            return super.page(new Page<T>(current , size) , queryWrapper);
        }

    service实现类方法:

    public IPage<SkuStock> findPage(SkuStock entity, String... args) {
            Map<String , Object> search = null;
            search = new HashedMap();
            search.put("1;eq" , "1");
            if (EmptyUtil.isNoEmpty(entity.getCode())
                    || EmptyUtil.isNoEmpty(entity.getWareCode())
            ){
                if (EmptyUtil.isNoEmpty(entity.getCode())){
                    search.put("code" , entity.getCode());
                }
                if (EmptyUtil.isNoEmpty(entity.getWareCode())){
                    search.put("ware_code" , entity.getWareCode());
                }
            }else {
                long limit = entity.getLimit();
                long page = entity.getPage();
                entity = new SkuStock();
                entity.setLimit(limit);
                entity.setPage(page);
            }
            return super.findPage(entity , search , args);
        }

    3.反射工具类:

    package org.bluedream.comm.utils;
    
    import java.lang.reflect.Field;
    import java.lang.reflect.Method;
    import java.util.ArrayList;
    import java.util.Arrays;
    import java.util.List;
    
    /**
     * @ClassName ReflexUtil
     * @Description TODO
     * @Author foxsand
     * @Data 2021-06-09 15:17
     * @Version
     */
    public class ReflexUtil {
    
        /**
         * 返回 entity 对象的所有属性,包含父类
         * @param obj
         * @return
         */
        public static List<Field> getObjectFields(Object obj){
            Class clazz = obj.getClass();
            List<Field> fieldList = new ArrayList<>() ;
            while (clazz != null) {//当父类为null的时候说明到达了最上层的父类(Object类).
                fieldList.addAll(Arrays.asList(clazz .getDeclaredFields()));
                clazz = clazz.getSuperclass(); //得到父类,然后赋给自己
            }
            return fieldList;
        }
    
        public static List<Field> getObjectFields(Class<?> clazz){
            List<Field> fieldList = new ArrayList<>() ;
            while (clazz != null){
                fieldList.addAll(Arrays.asList(clazz .getDeclaredFields()));
                clazz = clazz.getSuperclass(); //得到父类,然后赋给自己
            }
            return fieldList;
        }
    
        /**
         * 判断 Class entity 是否存在名称为 fieldName 的属性
         * @param fieldName
         * @param entity
         * @return
         */
        public static Boolean isField(String fieldName , Object entity){
            List<Field> fieldList = getObjectFields(entity);
            for (Field f1:fieldList
            ) {
                if (fieldName.equals(f1.getName()))
                    return true;
            }
            return false;
        }
    
        /**
         * 返回 entity 对象中的所有方法,包含父类
         * @param entity
         * @return
         */
        public static List<Method> getObjectMethods(Object entity){
            Class<?> clazz = entity.getClass();
            List<Method> methods = new ArrayList<>();
            while (clazz != null && clazz != Object.class) {//当父类为null的时候说明到达了最上层的父类(Object类).
                methods.addAll(Arrays.asList(clazz .getDeclaredMethods()));
                clazz = clazz.getSuperclass(); //得到父类,然后赋给自己
            }
            return methods;
        }
    
        public static List<Method> getObjectMethods(Class<?> clazz){
            List<Method> methods = new ArrayList<>();
            while (clazz != null && clazz != Object.class) {//当父类为null的时候说明到达了最上层的父类(Object类).
                methods.addAll(Arrays.asList(clazz .getDeclaredMethods()));
                clazz = clazz.getSuperclass(); //得到父类,然后赋给自己
            }
            return methods;
        }
    
        /**
         * 判断 Class entity 是否存在名称为 methodName 的方法
         * @param methodName
         * @param entity
         * @return
         */
        public static Boolean isMethod(String methodName , Object entity){
            List<Method> methods = getObjectMethods(entity);
            for (Method m1:methods
            ) {
                if (methodName.equals(m1.getName()))
                    return true;
            }
            return false;
        }
    
        /**
         * 循环向上转型, 获取对象的 DeclaredMethod
         * @param obj
         * @param methodName
         * @param parameterTypes  方法参数类型
         * @return
         */
        public static Method getDeclaredMethod(Object obj , String methodName , Class<?>...parameterTypes) {
            for (Class<?> clazz = obj.getClass(); clazz != Object.class && clazz != null; clazz = clazz.getSuperclass()) {
                try {
                    return clazz.getDeclaredMethod(methodName, parameterTypes);
                } catch (Exception e) {
                    // 这里甚么都不要做!并且这里的异常必须这样写,不能抛出去。
                    // 如果这里的异常打印或者往外抛,则就不会执行clazz=clazz.getSuperclass(),最后就不会进入到父类中了
                }
            }
            return null;
        }
    
        public static Object invoke(Object object, String methodName, Class<?>[] parameterTypes,
                                    Object[] parameters){
            Method method = getDeclaredMethod(object, methodName, parameterTypes);
            try {
                if (method != null){
                    method.setAccessible(true);
                    // 调用object 的 method 所代表的方法,其方法的参数是 parameters
                    return method.invoke(object, parameters);
                }
            }catch (Exception e1){
                e1.printStackTrace();
            }
            return null;
        }
    
        /**
         * 循环向上转型, 获取对象的 DeclaredField
         *
         * @param object
         *            : 子类对象
         * @param fieldName
         *            : 父类中的属性名
         * @return 父类中的属性对象
         */
    
        public static Field getDeclaredField(Object object, String fieldName) {
            Field field = null;
    
            Class<?> clazz = object.getClass();
    
            for (; clazz != Object.class && clazz != null; clazz = clazz.getSuperclass()) {
                try {
                    field = clazz.getDeclaredField(fieldName);
                    return field;
                } catch (Exception e) {
                    // 这里甚么都不要做!并且这里的异常必须这样写,不能抛出去。
                    // 如果这里的异常打印或者往外抛,则就不会执行clazz = clazz.getSuperclass(),最后就不会进入到父类中了
    
                }
            }
    
            return null;
        }
    
        /**
         * 直接设置对象属性值, 忽略 private/protected 修饰符, 也不经过 setter
         *
         * @param object
         *            : 子类对象
         * @param fieldName
         *            : 父类中的属性名
         * @param value
         *            : 将要设置的值
         */
    
        public static void setFieldValue(Object object, String fieldName, Object value) {
    
            // 根据 对象和属性名通过反射 调用上面的方法获取 Field对象
            Field field = getDeclaredField(object, fieldName);
    
            if (field != null){
                // 抑制Java对其的检查
                field.setAccessible(true);
                try {
                    // 将 object 中 field 所代表的值 设置为 value
                    field.set(object, value);
                } catch (IllegalArgumentException e) {
                    e.printStackTrace();
                } catch (IllegalAccessException e) {
                    e.printStackTrace();
                }
            }
        }
    
        /**
         * 直接读取对象的属性值, 忽略 private/protected 修饰符, 也不经过 getter
         *
         * @param object
         *            : 子类对象
         * @param fieldName
         *            : 父类中的属性名
         * @return : 父类中的属性值
         */
    
        public static Object getFieldValue(Object object, String fieldName) {
            // 根据 对象和属性名通过反射 调用上面的方法获取 Field对象
            Field field = getDeclaredField(object, fieldName);
    
            if (field != null){
                // 抑制Java对其的检查
                field.setAccessible(true);
                try {
                    // 获取 object 中 field 所代表的属性值
                    return field.get(object);
    
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
            return null;
        }
    
    
    }
    

    4.判空工具类:

    package org.bluedream.comm.utils;
    
    import java.util.Collection;
    import java.util.Map;
    
    public class EmptyUtil {
        //Suppress default constructor for noninstantiability
        private EmptyUtil(){
            throw new AssertionError();
        }
    
        public static boolean isEmpty(Object object){
            if (object == null){
                return true;
            }
            if (object instanceof int[]){
                return ((int[]) object).length == 0;
            }
            if (object instanceof double[]){
                return ((double[]) object).length == 0;
            }
            if (object instanceof long[]){
                return ((long[]) object).length == 0;
            }
            if (object instanceof byte[]){
                return ((byte[]) object).length == 0;
            }
            if (object instanceof short[]){
                return ((short[]) object).length == 0;
            }
            if (object instanceof float[]){
                return ((float[]) object).length == 0;
            }
            if (object instanceof char[]){
                return ((char[]) object).length == 0;
            }
            if (object instanceof Object[]){
                return ((Object[]) object).length == 0;
            }
            if (object instanceof CharSequence) {
                return ((CharSequence) object).length() == 0;
            }
            if (object instanceof Collection ){
                return ((Collection) object).isEmpty();
            }
            if (object instanceof Map){
                return ((Map) object).isEmpty();
            }
            return false;
        }
    
        public static boolean isNoEmpty(Object object){
            return !isEmpty(object);
        }
    
    }
    

    展开全文
  • QueryWrapper多表联查分页、IPage分页解决IPage+ QueryWrapper 多表联查、条件搜素、模糊匹配的分页问题实体类controllerserviceImpl重写的mapperxml最终sql点击可参考[QueryWrapperLambdaQueryWrapper-(条件查询)...

    解决IPage+ QueryWrapper 多表联查、条件搜素、模糊匹配的分页问题

    • 假如我们有一张user表,和一张department表 (关联关系表)
    • 要通过department(模糊匹配)到所有的user并且分页

    实体类

    @ApiModel(description = "用户")
    public class User {
    
        @ApiModelProperty(value = "主键")
        private Integer id;
    
        @ApiModelProperty(value = "用户名")
        private String username;
    
        @ApiModelProperty(value = "外键")
        private Integer departmentId;
        }
    
    
    
    @ApiModel(description = "部门")
    public class User {
    
        @ApiModelProperty(value = "主键")
        private Integer id;
    
        @ApiModelProperty(value = "部门名称")
        private String departmentName;
    

    controller

    @PostMapping("/user")
    @ApiOperation("用户条件查询")
    public ApiResponse<User> selectUser(@RequestBody Map<String, Object> queryMap) {
        try {
            return ApiResponse.ofSuccess(UserService.selectUser(queryMap));
        } catch (Exception e) {
            log.error("查询失败", e);
            return ApiResponse.ofError("查询查询失败");
        }
    }
    

    service

    • 注意 返回值为IPage
     IPage<User> selectUser(Map<String, Object> queryMap);
    

    Impl

    • user 为主表,正常使用QueryWrapper 查询即可
    • department 为关联表,字段名必须和xml中对应
       @Override
        public IPage<TcmcAlarm> eqAllAlarm(Map<String, Object> params) {
           // size 每页多少条
            long size = Long.parseLong(StringUtils.defaultIfBlank(String.valueOf(params.get("limit")), "10"));
            // 当前页
            long current = Long.parseLong(StringUtils.defaultIfBlank(String.valueOf(params.get("page")), "1"));
            }
            // 定义 QueryWrapper 
            QueryWrapper<TcmcAlarm> q = new QueryWrapper<>();
            // 用户名(主表)
            Object userName = params.get("userName");
            // 部门名称
            Object alarmType = params.get("departmentName");
            // 用户名模糊查询(常规查询)
             if (null != userName && userName.toString().trim().length() > 0) {
                q.lambda().like(User::getUserName(), userName);
            }
            // 联接表 
            if(null != departmentName && departmentName.toString().trim().length() > 0){
             q.eq("dt.department_name", departmentName);
            }
            IPage<TcmcAlarm> page = baseMapper.selectUserpage(
                    new Page<>(current, size), q);
            return page;
    
    • department.department_name
    • dt 表名,department_name 表字段
    • 重写selectUserpage
      常规操作中 ServiceImpl 封装了很多方法我们可以直接使用,其中就有分页,但是牵扯到复杂查询时我们尽量选择重写(如下)
    • Impl
      在这里插入图片描述
    • mapper在这里插入图片描述

    重写的mapper

    IPage<User> selectUserpage(IPage<T> page, @Param(Constants.WRAPPER) Wrapper<User> queryWrapper);
    

    xml

       <select id="selectUserpage" resultType="XXX.user">
            SELECT
            us.id id,
    		us.username username
            dt.department_name departmentName
            FROM
            user us
            LEFT JOIN department dt ON dt .id = us.departmentId
                ${ew.customSqlSegment}
        </select>
    
    • ${ew.customSqlSegment}相当于一个占位符,后续当你在mp的条件构造器中加入条件,mp的底层就会根据条件自动的在这个占位符处进行条件的拼接

    最终sql

      SELECT
            us.id id,
    		us.username username
            dt.department_name departmentName
            FROM
            user us
            LEFT JOIN department dt ON dt .id = us.departmentId
            where 
            dt.dt.department_name = "XX"
    

    QueryWrapper条件查询

    QueryWrapperLambdaQueryWrapper-(条件查询)

    总结

    本片文章例子较为简单,只说明用法,谢谢点赞和指正。

    展开全文
  • 在MyBatisPlus中,虽然框架自带的BaseMapper具有各种CRUD操作,但有时需要进行自定义的查询,如多表的连接查询: 首先准备实体类: @Data public class Dish implements Serializable { private static final long...
  • QueryWrapper多条件嵌套查询

    千次阅读 2021-03-22 10:54:21
    1.Mybatis-Plus自带分页 IPage<Product> page=new Page<>(); page.setCurrent(current); page.setSize(size);... productIPage = productMapper.selectPage(page, queryWrapper); pageBean.s
  • mybitsPlus QueryWrapper多表关联分页查询
  • userMapper.selectPage(page, queryWrapper); 上面这个分页查询方法,只能针对当前自己的实体,他很好的支持与解决,但是关联查询就不行了。 上面代码的底层,会通过拦截器PageInterceptor会进行拦截处理,会把...
  • } 指定要查询的列 @Test public void queryWrapperEleven() { QueryWrapper<User> queryWrapper = new QueryWrapper(); queryWrapper.select("id", "name", "age"); List<User> users = userMapper.selectList...
  • 我在做一个单的curd 真的感觉还有很长一段路,mybatis plus我还没学,项目就是这个,我一个单的增删改查做了四天,还好碰到了公司带我的肯教点东西 先看一下前端吧, 带参的条件查询查询所有信息我都是在一个...
  • 文件全面的提供了多表查询的方式,相信会帮倒大家的。
  • QueryWrapper查询的坑

    千次阅读 2021-03-01 16:05:38
    首先,先看代码示例: List<Entity> list = testService.list( new LambdaQueryWrapper<Entity>() .eq(ObjectUtils.isNotEmpty(req.getParam()),Entity::getParam, req.getParam().
  • QueryWrapper模糊查询

    2021-12-31 10:21:21
    如图一 QueryWrapper表达式 like 没有进行%%模糊查询 想要图二效果 代码是有什么问题吗 麻烦指正 谢过了~
  • 标题mybatis-plus QueryWrapper pojo: @Data @EqualsAndHashCode(callSuper = false) @Accessors(chain = true) @TableName("m_goods") @ApiModel(value="Goods对象", description="") public class Goods ...
  • 纯属用.eq(""::"","").eq.. 如果不写sql能通过lambdaquerywrapper联表查询
  • 自定义的QueryWrapper实现查询

    千次阅读 2021-07-14 18:30:55
    想要用QueryMapper,而不用xml,所以为了实现若依那样的,自己重写了QueryMapper​ ...所以,自己使用反射写了一个QueryWrapper的myAllEq方法,可以实现传入一个实体类,直接实现全部属性查询​ 声明提要: pac
  • FROM <include refid="tables" /> ${ew.customSqlSegment} select> mapper> 重点: MybatisPlus会将查询参数构成的条件和分页的page及limit自动组装到Sql中 以后进行多表联合查询时,可以使用以下方法来进行数据的...
  • 1. 熟悉常见的 DESC employees; DESC departments; DESC locations; 引入:查询一个员工(ABEL)在哪个城市工作 SELECT * FROM employees WHERE last_name = 'Abel'; SELECT * FROM departments WHERE department...
  • mybatisPlus 使用mapper多表多连接查询

    万次阅读 热门讨论 2018-11-27 22:41:47
    这个问题花了我3个小时,。先上图,以后再解释 ... QueryWrapper<ComJob> wrapper = new QueryWrapper(); wrapper.eq("job.id",jobid); List<ComJob> comJob = jobService.getComJob(wrapper);  
  • List<Map<String,Object>... wrapper1, @Param("ew2") Wrapper<Dept> wrapper2); <select id="linkUserAndDept" resultType="java.util.Map"> select u.name,u.age,u.address,d.*...
  • 基于Mybatis Plus实现多表分页查询

    万次阅读 多人点赞 2019-07-29 17:03:43
    注意:Mybatis Plus 3.0.7 版本才开始用【自定义sql】+【QueryWrapper】,低版本不能使用,还是老实写SQL进行条件拼接 2.0、源码分析 在Wrapper<T>接口中就有如下方法 /** * 获取自定义SQL 简化自定义XML...
  • 条件查询首先使用QueryWrapper创建一个wrapper对象存放条件。例如: //创建一个QueryWrapper的对象 QueryWrapper<User> wrapper = new QueryWrapper<>(); //通过QueryWrapper设置条件 //ge gt le lt
  • 特殊QueryWrapper查询解决所有问题

    千次阅读 2021-07-15 20:58:24
    可以先看以前的自定义查询 自定义的QueryMapper查询 现在我添加了注解查询,通过使用 /** 用户账号 */ @TableField(value = "user_name") @MapperQuery(queryType = QueryType.EQ) private String userName; /...
  • 现在只支持QueryWrapper的eq和like功能 后续拓展SqlAnnotation的注解值 可以进行其他匹配 先看实体类 public class EnrollmentRecord implements Serializable { private static final long serialVersionUID = 1L...
  • Mybatis plus+QueryWrapper+Swagger2实现所有类超级查询 后台解放 对象获取注解 获取表名 获取列名 自定义查询

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 13,443
精华内容 5,377
关键字:

querywrapper多表查询

友情链接: GB-T2659-2000.rar