我正在尝试构建一个JDOQL查询(使用datanucleus),该查询将根据拥有的一对多子类中的条件搜索父类的匹配。查询如下所示:
Query lQ = lPm.newQuery("select from "+Module.class.getName()+
" where moduleMappings.contains(m)" +
" && showNameParam.matches(m.criteria.trim())");
lQ.declareVariables(ModuleMapping.class.getName()+" m");
lQ.declareParameters("String showNameParam");
lRet = (List<Module>) lQ.execute("StarTrek");
我的数据集看起来像这样:
查询从不匹配任何内容!但是,如果我用 literal 替换matches
JDOQL方法的参数:
Query lQ = lPm.newQuery("select from "+Module.class.getName()+
" where moduleMappings.contains(m)" +
" && showNameParam.matches('.*StarTrek.*')");
事情适用于该单个示例,我的查询将找到模块[2] 。我错过了什么?我不允许使用映射字段的内容作为JDOQL方法的参数吗?我是否需要以某种方式逃避事情?
戴夫
答案 0 :(得分:0)
日志显然会告诉您为查询调用了哪些SQL。您还可以解决为什么要混用API JDOQL和单字符串JDOQL ...如果使用单字符串,参数/变量的定义应该在单字符串中。
答案 1 :(得分:0)
所以我想到了这一点,虽然对我来说它似乎是JDOQL或datanucleus中的一个错误。使用映射字段作为匹配方法的参数时,生成的SQL不会将JDOQL语法转换为数据存储的语法(在我的示例中为SQL)。因此,在上面的示例中,如果我将条件字段更改为使用SQL通配符语法而不是JDOQL语法,则事情将开始起作用。
具体来说,如果在上面的示例中我使用criteria="%StarTrek%"
而不是criteria=".\*StarTrek.\*"
,则JDOQL查询将开始匹配。
这对我来说似乎不对,因为不同的数据存储可以使用不同的匹配语法,但是这种解决方法让我再次移动......