https://blog.csdn.net/qq_38288606/article/details/78673528
Java操作MongoDB采用MongoRepository倉庫進(jìn)行條件查詢
2017年11月30日 10:50:59?michael7520?閱讀數(shù):9833
?版權(quán)聲明:本文為博主原創(chuàng)文章,未經(jīng)博主允許不得轉(zhuǎn)載。https://blog.csdn.net/qq_38288606/article/details/78673528
Java操作MongoDB采用MongoRepository倉庫進(jìn)行條件查詢
1.實體類:
publicclassPersonimplementsSerializable{privatestaticfinallongserialVersionUID = -8288372263395673353L;privateString id;privateString name;privateintage;// set/get ...}
1
2
3
4
5
6
7
8
2.倉庫:?
如果只是用簡單的CRUD操作,則不需要添加其他的方法,MongoRepository提供的方法足夠我們使用。
publicinterfacePersonRepositoryextendsMongoRepository{}
1
2
3.利用MongoRepository中的查詢進(jìn)行操作?
首先,在service層中,將PersonRepository注入到service類中
publicclassPersonServiceImplimplementsIPersonService{@AutowiredprivatePersonRepository personRepository;}
1
2
3
4
1)查詢所有的數(shù)據(jù):
publicListqueryAll()throwsException {returnpersonRepository.findAll();}
1
2
3
2)查詢所有的數(shù)據(jù)帶分頁:?
方法為:Page
publicPagequeryAllByPage(intpage,introws)throwsException {? ? PageRequest pageRequest =newPageRequest(page-1,rows);returnpersonRepository.findAll(pageRequest);}
1
2
3
4
3)查詢所有的數(shù)據(jù)的數(shù)量:
publicintcount()throwsException {longsize = personRepository.count();intcount = Integer.valueOf(String.valueOf(size));returncount;}
1
2
3
4
5
4)根據(jù)實體類中的屬性進(jìn)行查詢:?
當(dāng)需要根據(jù)實體類中的屬性查詢時,MongoRepository提供的方法已經(jīng)不能滿足,我們需要在PersonRepository倉庫中定義方法,定義方法名的規(guī)則為:find + By + 屬性名(首字母大寫),如:根據(jù)姓名查詢Person?
倉庫中添加的方法:
publicPersonfindByName(String name);
1
它會自動根據(jù)name查詢。?
service中的方法:
publicvoidqueryByFirstName(String name)throwsException {? ? Person person = personRepository.findByName(name);}
1
2
3
若根據(jù)其他屬性查詢,方法類似!
5)根據(jù)實體類中的屬性進(jìn)行模糊查詢:?
當(dāng)需要根據(jù)實體類中的屬性進(jìn)行模糊查詢時,我們也需要在PersonRepository倉庫中定義方法,模糊查詢定義方法名的規(guī)則為:find + By + 屬性名(首字母大寫) + Like,如:根據(jù)姓名進(jìn)行模糊查詢Person?
倉庫中添加的方法:
publicListfindByNameLike(String name);
1
service中的方法:?
在service中直接調(diào)用倉庫中我們剛才定義的方法即可!
publicListqueryByFirstNameLike(String name)throwsException {returnpersonRepository.findByNameLike(name);}
1
2
3
6)根據(jù)實體類中的屬性進(jìn)行模糊查詢帶分頁:?
帶分頁的模糊查詢,其實是把模糊查詢以及分頁進(jìn)行合并,同時我們也需要在PersonRepository倉庫中定義方法,定義方法名的規(guī)則和模糊查詢的規(guī)則一致,只是參數(shù)不同而已。?
倉庫中添加的方法:
publicPagefindByNameLike(String name,Pageable pageable);
1
在service中對倉庫中的方法的調(diào)用:
publicListqueryByNameAndPage(intpage,introws, String name)throwsException {? ? PageRequest pageRequest =newPageRequest(page-1,rows);returnpersonRepository.findByNameLike(name, pageRequest).getContent();}
1
2
3
4
7)根據(jù)實體類中的屬性進(jìn)行模糊查詢帶分頁,同時指定返回的鍵(數(shù)據(jù)庫中的key,實體類中的屬性):?
解釋一下什么是指定返回的鍵:也就是說當(dāng)我們進(jìn)行帶分頁的模糊查詢時,不想返回數(shù)據(jù)庫中的所有字段,只是返回一部分字段。例如:只返回Person中的id和name,不返回age.?
若想指定返回的鍵,我們需要在PersonRepository中添加方法,同時使用注解@Query。?
倉庫中定義的方法:
@Query(value="{'name':?0}",fields="{'name':1}")publicPagefindByNameLike(String name,Pageable pageable);
1
2
其中value是查詢的條件,?0這個是占位符,對應(yīng)著方法中參數(shù)中的第一個參數(shù),如果對應(yīng)的是第二個參數(shù)則為?1。fields是我們指定的返回字段,其中id是自動返回的,不用我們指定,bson中{‘name’:1}的1代表true,也就是代表返回的意思。?
在service中對倉庫中的方法的調(diào)用:
publicListqueryByNameAndPage(intpage,introws, String name)throwsException {? PageRequest pageRequest =newPageRequest(page-1,rows);returnpersonRepository.findByNameLike(name, pageRequest).getContent();}
1
2
3
4
特殊查詢:?
1)需要查詢所有數(shù)據(jù),同時指定返回的鍵?
當(dāng)我們需要查詢所有數(shù)據(jù),同時需要指定返回的鍵時,則不能使用倉庫中自帶的findAll()方法了。我們可以查詢所有id不為空的數(shù)據(jù),同時指定返回的鍵。當(dāng)我們需要根據(jù)一個key且該key不為空進(jìn)行查詢,方法名的定義規(guī)則為:find + By + 屬性名(首字母大寫) + NotNull。?
倉庫中定義的方法:
@Query(value="{'_id':{'$ne':null}}",fields="{'name':1}")publicPagefindByIdNotNull(Pageable pageable);
1
2
service中調(diào)用倉庫中的方法:
publicListqueryAll(intpage,introws)throwsException {? PageRequest pageRequest =newPageRequest(page-1,rows);returnpersonRepository.findByIdNotNull(pageRequest).getContent();}
1
2
3
4
2)MongoDB的其他查詢不一一列舉,但將java中的倉庫定義的方法名的規(guī)則列舉如下,使用時將倉庫中方法上的注解@Query中的value進(jìn)行適當(dāng)泰歐正即可。
GreaterThan(大于)?
方法名舉例:findByAgeGreaterThan(int age)?
query中的value舉例:{“age” : {“$gt” : age}}
LessThan(小于)?
方法名舉例:findByAgeLessThan(int age)?
query中的value舉例:{“age” : {“$lt” : age}}
Between(在…之間)?
方法名舉例:findByAgeBetween(int from, int to)?
query中的value舉例:{“age” : {“[Math Processing Error]gt":from,"lt” : to}}
Not(不包含)?
方法名舉例:findByNameNot(String name)?
query中的value舉例:{“age” : {“$ne” : name}}
Near(查詢地理位置相近的)?
方法名舉例:findByLocationNear(Point point)?
query中的value舉例:{“l(fā)ocation” : {“$near” : [x,y]}}