2013-11-22 22 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'