SpringBootJpa分页多条件查询

1 篇文章 0 订阅
1 篇文章 0 订阅
先贴上代码,然后在代码下面带上解释,如果不这样做可能出现的问题。
这是我自己写的,我也遇到很多问题,不是复制的别人的,如果耐心看完,相信一定能够解决你的问题。
谢谢大家的支持!
    public Page<Film> findFilmListOfPageAndMc(Film film, Pageable pageable) {
        ExampleMatcher matcher = ExampleMatcher.matching();

        Film filmMatcher = new Film();
        if (film.getName() != null && !film.getName().trim().equals("")){
            matcher = matcher.withMatcher("name" , ExampleMatcher.GenericPropertyMatchers.contains());
            filmMatcher.setName(film.getName());
        }
        if (film.getDirector() != null && !film.getDirector().trim().equals("")){
            matcher = matcher.withMatcher("director" , ExampleMatcher.GenericPropertyMatchers.contains());
            filmMatcher.setDirector(film.getDirector());
        }
        if (film.getLeadingRole() != null && !film.getLeadingRole().trim().equals("")){
            matcher = matcher.withMatcher("leadingRole" , ExampleMatcher.GenericPropertyMatchers.contains());
            filmMatcher.setLeadingRole(film.getLeadingRole());
        }
        if (film.getType() != null && !film.getType().toString().trim().equals("") && film.getType() != 0){
            matcher = matcher.withMatcher("type" , ExampleMatcher.GenericPropertyMatchers.exact()); //精确的
            filmMatcher.setType(film.getType());
        }

        Example<Film> example = Example.of(filmMatcher ,matcher);

        Page<Film> filmPage = filmDao.findAll(example, pageable);

        return filmPage;
    }

代码解释

ExampleMatcher matcher = ExampleMatcher.matching();//创建一个匹配器
		/*
			下面的代码核心是多条件的判断,多条件也就是条件个数不确定,条件匹配度不确定
			通过判断这个字段需不需要判断,如果需要,通过matcher.withMatcher()方法
			添加一个匹配规则并返回一个新的匹配器。
			方法需要传入(字段名称【注意实体类字段,不是数据库对应字段】,匹配规则)
			对于匹配规则在下面一一列举
		*/
        if (film.getName() != null && !film.getName().trim().equals("")){
            matcher = matcher.withMatcher("name" , ExampleMatcher.GenericPropertyMatchers.contains());
            filmMatcher.setName(film.getName());
        }
		............
		............
		//通过实体类和匹配器生成一个匹配例对象
		Example<Film> example = Example.of(filmMatcher ,matcher);
		//分页查询时把匹配例一同传入
        Page<Film> filmPage = filmDao.findAll(example, pageable);

匹配规则

	 //对于matcher.withMatcher()中的参数     
	 ExampleMatcher.GenericPropertyMatchers.contains();  // 包含
     ExampleMatcher.GenericPropertyMatchers.exact();  //精确 (也是默认后面解释)
     ExampleMatcher.GenericPropertyMatchers.startsWith(); //开始包含 "xx%"
     ExampleMatcher.GenericPropertyMatchers.endsWith();//结尾包含 "%xx"
     //对于matcher的方法
	 matcher.withStringMatcher(StringMatcher.CONTAINING) //改变默认字符串匹配方式:模糊查询
            .withIgnoreCase(true) //改变默认大小写忽略方式:忽略大小写
            .withMatcher("address", GenericPropertyMatchers.startsWith()) //地址采用“开始匹配”的方式查询
            .withIgnorePaths("focus");  //忽略属性:是否关注。因为是基本类型,需要忽略掉
	
	//需要注意!!!的是
	//withStringMatcher()和withIgnoreCase()方法针对的是所有字段,
	//withMatcher()和withIgnorePaths()针对的是某个字段
	//还有其他方法,其他参数,需要的可以编写代码的时候根据提示,点进去或者查翻译找到需要的。

特别注意问题

为什么我传入的film实体类对象不用,而又重新创建了一个?
如果我用传入的实体类来创建Example对象,字段留空我还发现总是查询不到,于是打印了一下sql语句

在这里插入图片描述

查看上面sql语句发现,把那四个字段全部按照精确去查询了,而我留空是“”,当然查询不到了(所以
也说明默认是按照exact精确查询的)。
我的film对象是从前端获取了那四个字段,全为“”,其他字段null,
Film(id=null, name=, releaseTime=null, publicCompany=null, director=, leadingRole=, type=0, publicCountry=null, synopsis=null, imgAddr=null, videoAddr=null)
Film(id=null, name=null, releaseTime=null, publicCompany=null, director=null, leadingRole=null, type=null, publicCountry=null, synopsis=null, imgAddr=null, videoAddr=null)
只要不为空就默认按照精确查找。
所以需要再穿件一个Film对象,如果哪些值需要按照规则查询,把这个字段值重新封装(推荐),
也可以else{把当前值=null}

相信大家和我一样,搜出来的问题,打开好几个页面长得都大差不差,复制粘贴,把重要的给遗漏了,很多时候非但解决不了问题,还让我们怀疑编译器,怀疑电脑cpu,怀疑人生,怀疑一切

如果还有什么问题,大家可以下面评论,我看到了会回复!
(拒绝复制粘贴,禁止转载,需要需原创发文者同意)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值