先贴上代码,然后在代码下面带上解释,如果不这样做可能出现的问题。
这是我自己写的,我也遇到很多问题,不是复制的别人的,如果耐心看完,相信一定能够解决你的问题。
谢谢大家的支持!
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,怀疑人生,怀疑一切
如果还有什么问题,大家可以下面评论,我看到了会回复!
(拒绝复制粘贴,禁止转载,需要需原创发文者同意)