2015-11-12 69 views
1

我正在尋找一種動態創建參數化查詢的方法。實質上,我想從應用程序中分離查詢並使其可配置。使用Spring數據進行動態參數化查詢mongodb

舉例來說,我想創建一個帶參數的查詢,如

{ firstName: ?0 } 

正如你可能知道,這是在Spring數據完全feasable MongoDB的使用接口:

interface MyQuery { 

    @Query("{firstName: ?0}") 
    public Person getByFirstName(final String name); 
} 

但這在編譯時耦合我的查詢,而我想在運行時更改它們。


我不能動態地找到一種方法來使用這種機制。在這個引擎下使用的特定類是StringBasedMongoQuery,並使用大量的反射實用工具來確定查詢,參數,迴歸類型等。您可以使用Groovy管理其中的大部分內容,但我認爲註釋似乎是一個泡泡。

這讓我覺得我選擇了錯誤的方式來解決這個問題。


我自己只看到幾個選項左:

  • 重新實現Spring的花哨查詢解析爲蒙戈自己(似乎很多工作)
  • 實施窮人的查詢參數替換自己。 (這不會是靈活的,不會產生對空參數正確的結果......)

我在這裏的損失,這太糟糕了,我似乎無法使用StringBasedMongoQuery獨立的,這似乎是加上反思。


更新:

我的建議看似毫無意義在這裏,因爲我注意到也春天數據MongoDB的StringBasedMongoQuery不支持空的參數的「動態」查詢;實際上這是非常合乎邏輯的,當參數爲空時很難將部分從查詢中刪除,而且很難做到這一點。

下揭示了問題的一些輕:https://jira.spring.io/browse/DATAJPA-209

所以看起來我可能的選擇都轉移到:

  • 我們作出不同的查詢和使用的查詢取決於可用的參數。這爲保養提供了一個可能的噩夢。
  • 我們公開了一個groovy或其他JVM腳本,它允許我們使用Spring的可用Criteria-esque API或mongodb Java驅動程序之一,然後爲我們構建查詢。這樣做的缺點是,想要配置查詢的人現在必須至少了解Java。
  • 我們使得我們的查詢在需要時以可讀性爲代價是無效的。

回答

0

我發現了一個更好,更容易地解決這個問題比建議我已經自己做了這裏在這個崗位。我會告訴你我將如何解決這個問題以備將來參考。

雖然MongoDB中有沒有像查詢參數之類的東西,我們可以做的東西很多使用其他一些相當獨特結構的MongoDB提供更方便,具有結構嚴謹在一起。我們可以堅持這種結構,因爲它涉及用戶的動態可配置查詢。

我們的結構簡單,如下。我們有一個基本的查詢結構如下所示:

{ $and: []} 

我們定義將總是充滿一個基本的查詢這可能是爲空JS對象一樣簡單。像這樣,我們的查詢變成

{ $and: [{}] } 

所以,這只是查詢一切。現在我們可以爲每個可動態的條件定義一個子查詢。如果符合條件,我們可以選擇將此查詢添加到$and。由於我們eadhere把一切都在構建,我們知道查詢會怎麼看,我們並不需要很花哨的參數替換得到的東西非常靈活,可以輕鬆的工作。

查詢可以變成例如:

{ $and: [{}, {active: true}, {started: false}]} 

而且我們可以添加那些小的子查詢添加和開始,每當我們想要的。

+0

我安靜不得到你有什麼在這裏。你可以顯示你的自定義MongoRepository接口嗎? – Will