2014-04-02 52 views
1

彈簧數據提供各種存儲庫,用於MongoDB的CRUD,分頁和排序。 當我們需要使用各種屬性的mongodb文檔時,我們傾向於編寫findBy方法或編寫一個明確的查詢方法,其註釋的註釋編號爲@Query。 但是,如果我的文檔有很多屬性,並且我需要各種方法來獲取文檔,那麼spring是否提供了一個「存儲庫方法」,它接受了屬性和值的映射? 書寫各種findBy可能會很麻煩。使用QueryDSL似乎是一種選擇,但需要代碼生成和build.gradle更改。如果基於地圖的解決方案不可用,我可以使用QueryDSL。彈簧數據爲mongodb與基於地圖的查找

對於前:

class FooDocument { 
    String id ;//mongodb ObjectId 
    String name 
    String version 
    boolean deleteIndicator 
    ... any more attributes 
} 

需要在倉庫裏的方法一樣

List<FooDocument> findByMap (Map attrValMap); 

調用方法(常規)

repository.findByMap ([ "name" : "fooname", "version" : "1.0" ]) 
repository.findByMap ([ "name" : "fooname"]) 
repository.findByMap ([ "version" : "1.0", "deleteIndicator" : false]) 

很願意編寫使用Criteria/Query組合這種方法或者基於BasicDBObject的基於MongoOperations接口的spetch訪存ng數據不提供這種開箱即用的功能。

回答

1

我不確定Spring Data是否可以輕鬆完成。但是,如果你願意使用MongoDB的BasicDBObject得到你所需要的,那麼你可以通過以下方式使用它:

BasicDBObject doc = new BasicDBObject("name", "fooname").append("version", "1.0"); 
DBCursor cursor = find(doc); 
List<FooDocument> fooDocList = new ArrayList<FooDocument>(); 
while (cursor.hasNext()) { 
    DBObject obj = cursor.next(); 
    FooDocument foo = mongoTemplate.getConverter().read(FooDocument.class, obj); 
    fooDocList.add(foo); 
} 
+0

查詢選項似乎更容易。我可以在存儲庫上聲明findByQuery(Query query)方法,並提供此方法的自定義實現,該方法將調用委託給接受Query實例的MongoOperations#方法。我不需要重複迭代和獲取。但希望spring repository能夠爲mongodb提供這種功能。 –