为什么使用“匹配”语义的JDOQL查询仅适用于文字?

时间:2010-09-28 05:54:54

标签: jdo datanucleus jdoql

我正在尝试构建一个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");

我的数据集看起来像这样:

  • 模块[1]
    • ModuleMapping [1]:criteria =“。*”
  • 模块[2]
    • ModuleMapping [1]:criteria =“。* StarTrek。*”
    • ModuleMapping [2]:criteria =“。* StarWars。*”

查询从不匹配任何内容!但是,如果我用 literal 替换matches JDOQL方法的参数:

Query lQ = lPm.newQuery("select from "+Module.class.getName()+
            " where moduleMappings.contains(m)" +
            " && showNameParam.matches('.*StarTrek.*')");

事情适用于该单个示例,我的查询将找到模块[2] 。我错过了什么?我不允许使用映射字段的内容作为JDOQL方法的参数吗?我是否需要以某种方式逃避事情?

戴夫

2 个答案:

答案 0 :(得分:0)

日志显然会告诉您为查询调用了哪些SQL。您还可以解决为什么要混用API JDOQL和单字符串JDOQL ...如果使用单字符串,参数/变量的定义应该在单字符串中。

答案 1 :(得分:0)

所以我想到了这一点,虽然对我来说它似乎是JDOQL或datanucleus中的一个错误。使用映射字段作为匹配方法的参数时,生成的SQL不会将JDOQL语法转换为数据存储的语法(在我的示例中为SQL)。因此,在上面的示例中,如果我将条件字段更改为使用SQL通配符语法而不是JDOQL语法,则事情将开始起作用。

具体来说,如果在上面的示例中我使用criteria="%StarTrek%"而不是criteria=".\*StarTrek.\*",则JDOQL查询将开始匹配。

这对我来说似乎不对,因为不同的数据存储可以使用不同的匹配语法,但是这种解决方法让我再次移动......