2013-11-22 70 views
1

使用JDO與Datanucleus,我想從我的數據庫(使用jdoql)過濾一些數據。我想使用正則表達式進行一些複雜的搜索,我發現JDO提供了接受正則表達式的String方法「matches」,根據DATANUCLEUS文檔,此方法可以接收任何類型的ExpReg:使用字符串JDOQL DATANUCLEUS過濾匹配

matches(String pattern):返回字符串是否與傳入的表達式匹配。 pattern參數遵循java.lang.String.matches方法的規則。

我能夠基於一些正則表達式做過濾(如「*」,「‘’*」),但不與他人(如[ABCD])

有人可以證實,沒有支持所有正則表達式語法集合?

Query q = pm.newQuery(cl, "this.name.matches(filterName)"); 
q.declareParameters("String filterName"); 
List results = (List)q.execute("Bo.*"); 
return pm.detachCopyAll(results); 

- >返回書,第二冊

But with : q.execute("B[aoe]ok") return nothing ! 

感謝

+0

我敢肯定,如果你看了日誌(如SQL調用),你很可能更好地瞭解 – DataNucleus

+0

謝謝,但我在哪裏可以看到從javax.jdo.Query調用的sql? 日誌文件中沒有sql跟蹤。 – Jugu

+0

當開發人員將日誌記錄配置到正確級別(DEBUG)時,根據公共可見的DataNucleus文檔,日誌文件中有SQL。 – DataNucleus

回答

0

經過幾十個失敗的測試,我可以說,(與DN 2.1)比賽不工作(針對JAVA測試string.matches(正則表達式)):http://www.datanucleus.org/products/accessplatform_2_1/jdo/jdoql_methods.html

在我的測試中,我有以下的正則表達式:

(PT)?999999990 

是由翻譯成JDOQL:

LIKE '(PT)<UNPRINTABLE>999999990' 

數據庫包含像許多記錄:

PT999999990
...

而且,取決於REGEX,JDOQL解釋器似乎改變了表達式...

以下的正則表達式:

(?i)(PT)?999999990 

通過JDOQL翻譯成:

LIKE '(PT)<UNPRINTABLE>999999990'