Java操作MongoDB采用MongoRepository倉庫進(jìn)行條件查詢(轉(zhuǎn))

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]}}

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容