1

我正在尝试构建一个 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]: 标准=".*"
  • 模块[2]
    • ModuleMapping[1]: 标准=".*星际迷航.*"
    • ModuleMapping[2]: 标准=".*StarWars.*"

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

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

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

戴夫

4

2 回答 2

1

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

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

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

于 2010-09-29T04:09:01.960 回答
0

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

于 2010-09-28T09:14:49.727 回答