Springboot通过MongoRepository实现可变条件查询

申明

	本文章系我通过查询资料、与大佬讨论而得出的结论,如有雷同请与我联系。如需转载请标明出处即可,无需与我商议。
同时我也会对引用的文章进行标注。谢谢各位赏脸观看!

前言

本文章适用于之前在项目中已经使用MongoRepository进行过数据的简单的增删改查,如今由于不可抗因素导致的需要通过接收可变条件来进行查询。

前提

您在查阅本文章时,博主默认您已经使用Springbootmongodb进行整合且使用了MongoRepository对数据进行过相关操作了。如若没有请先进行相关的操作,在此我便不再进行说明了,望谅解!


下面我要开始讲述解决过程了(各抒己见,勿喷)
首先,您可以了解一下MongoRepository的一些简单的使用,我看过多篇文章,感觉都差不多,就随便推荐一篇给您看看吧,如果您比较熟悉的话,请自行跳过。
Java操作MongoDB采用MongoRepository仓库进行条件查询
通过阅读该博主的文章,您会发现MongoRepository仓库功能已经比较完善了,但是您会发现不光是这篇文章,我网上查阅了多篇文章都没有找到MongoRepository仓库对于多个条件查询、时间范围查询等的记录。我原本是打算推翻之前所有的使用MongoRepository而改用MongoTemplate的,或者开辟一套使用MongoTemplate的达到可变条件查询的目的,然而由于多方面的因素最终还是放弃了。
没办法啊,在这个问题上已经纠结很久了,只能去请教大佬了,通过大佬通过各种方式网上查询,终于找到一个还算可行的文章,一下便是那篇文章,真的很感谢这位博主哦。
Spring data mongodb 替换 Repository 实现类,findAll 排除 字段
看了这篇文章作为行业萌新的我是一脸懵B啊,先不管怎样,依样画葫芦总会吧,先把问题解决了然后再去思考这是一个什么原理吧。依据文章中的写法我对项目相关内容进行了解决最后总算是解决了这个棘手的问题。

注意事项

虽然找到了方法,但是由于需求等方面的原因难免不会遇到这样那样的问题,在此做一下记录希望能对您有所帮助。

  • 相关类导入文档
import org.springframework.data.domain.Example;
import org.springframework.data.domain.ExampleMatcher;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Sort;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
  • 提供一段排序方法代码
 Sort sort = makeTimeSort();
 PageRequest pageRequest;
 //page为页面传过来的分页类
 if(page!=null){
    //mongodb里面分页起始页码从0开始,而页面传过来的一般从1开始,博主在这吃过亏,望注意。
    pageRequest = new PageRequest(page.getCurrentPage() - 1 < 0 ? 0 
         : page.getCurrentPage() - 1, page.getShowCount(), sort);
 }else{
    pageRequest =  new PageRequest(0, Integer.MAX_VALUE, sort);
 }
 
 private Sort makeTimeSort(){
    List orders = new ArrayList<>();
    //time为您要作为查询排序的字段
    Sort.Order order = new Sort.Order(Sort.Direction.DESC, "time");
    orders.add(order);
    Sort sort = new Sort(orders);
    return sort;
 }
  • 提供一些Query类添加查询条件的方法
//""内为您要查询所对应的字段名
Query query =new Query();
//字段相等查询
query.addCriteria(Criteria.where("ID").is("PG12138"));
//字段不等查询
query.addCriteria(Criteria.where("ID").ne("PG12138"));
//字段模糊查询
query.addCriteria(Criteria.where("ID").regex(".*?\\" +"PG12138"+ ".*"));
//时间范围查询
if(startTime != null || endTime() != null){
	Criteria sub = Criteria.where("time");
	if(startTime  != null){
		//gte:>=   gt:>
		sub = sub.gte(startTime);
	}
	if(endTime  != null){
		//lte:<=   lt:<
		sub = sub.lte(endTime);
	}
	query.addCriteria(sub);
}

  • 一些概念的了解
    静态代理 动态代理 CGLIB SPRING动态代理

补充

虽然之前的一切都看着比较完美,然而大佬认为Example这个类使用的有点多余(感觉完全可以将所有查询条件都用Query类整合),于是对代码进行了一些修改,暂时还没有发现问题。

public class MySimpleMongoRepository  
	extends SimpleMongoRepository {
    private final MongoOperations mongoOperations;
    private final MongoEntityInformation entityInformation;


    public MySimpleMongoRepository(MongoEntityInformation metadata,
	    MongoOperations mongoOperations) {
        super(metadata, mongoOperations);
        this.entityInformation = metadata;
        this.mongoOperations = mongoOperations;
    }

	//包含Example的方法
	public  Page findAll(final Example example,final Query query,
		Pageable pageable){
        Assert.notNull(example, "Sample must not be null!");
        query.addCriteria((new Criteria()).alike(example)).with(pageable);
        List list = this.mongoOperations.find(query, example.getProbeType(),
					        this.entityInformation.getCollectionName());
        return PageableExecutionUtils.getPage(list, pageable, 
		        () -> mongoOperations.count(query,example.getProbeType(),
		        entityInformation.getCollectionName()));
    }
	
	//去除Example的方法(大佬修改)
	public  Page findAll(Query query, Pageable pageable, Class clazz) {
		final Class clazz2  = (Class) ClassUtils.getUserClass(clazz);
        query.with(pageable);
        List list = this.mongoOperations.find(query,clazz,
					        this.entityInformation.getCollectionName());
        return PageableExecutionUtils.getPage(list, pageable,
		        () -> mongoOperations.count(query,clazz2,
		        entityInformation.getCollectionName()));
	}
}

//调用方法
page result =EntityRespository.findAll( query, pageRequest, Entity.class);

大概就这些了吧,希望上面的内容能够对您有所帮助,同时也希望您能够分享一下在工作遇到的一些问题以及对其进行解决的文章。
再次感谢您的访问!

2018年12月25日补充

有朋友问我jar包的事情,我重新翻看了下项目,您可以去阿里云仓库搜索org.springframework.data,我项目里面的mongo相关类大部分来自这个文件。
Springboot通过MongoRepository实现可变条件查询_第1张图片

你可能感兴趣的:(mongodb)