Почему JDOQL-запрос, использующий семантику «совпадения», работает только с литералом? - PullRequest
1 голос
/ 28 сентября 2010

Я пытаюсь создать запрос 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");

Мой набор данных выглядит примерно так:

  • Module [1]
    • ModuleMapping [1]: критерии = ". * "
  • Module [2]
    • ModuleMapping [1]: критерии =". * StarTrek. * "
    • ModuleMapping [2]:критерии = ". * StarWars. *"

Запрос никогда не совпадает ни по чему!Однако, если я заменим аргумент метода matches JDOQL на литерал :

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

В этом примере все будет работать, и мой запрос найдет Модуль[2] * 1 029 *.Что мне не хватает?Разрешено ли мне использовать содержимое сопоставленного поля в качестве аргумента метода JDOQL?Мне нужно каким-то образом убежать?

Дейв

Ответы [ 2 ]

0 голосов
/ 29 сентября 2010

Так что я понял это, хотя мне кажется, что это ошибка в JDOQL или datanucleus. При использовании сопоставленного поля в качестве аргумента метода совпадений сгенерированный SQL не переводит синтаксис JDOQL в синтаксис хранилища данных (в моем случае, SQL). Так что в моем примере выше, если я изменю поля критериев для использования синтаксиса с подстановочными символами SQL вместо синтаксиса JDOQL, все начнет работать.

В частности, если в моем примере выше я использую criteria="%StarTrek%" вместо criteria=".\*StarTrek.\*", запросы JDOQL начнут совпадать.

Мне кажется, что это неправильно, поскольку разные хранилища данных могут использовать разный синтаксис соответствия, но этот обходной путь заставляет меня снова двигаться ...

0 голосов
/ 28 сентября 2010

В журнале, очевидно, будет указано, какой SQL вызывается для вашего запроса.Вы также можете указать, почему вы смешиваете API JDOQL и однострочный JDOQL ... определение параметров / переменных должно быть в одной строке, если используется одна строка.

...