1

所有されている 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]: 基準=".*StarTrek.*"
    • ModuleMapping[2]: 基準=".*StarWars.*"

クエリは何にも一致しません! ただし、matchesJDOQL メソッドへの引数をリテラルに置き換えると、次のようになります。

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

その 1 つの例では問題なく動作し、私のクエリはModule[2]を見つけます。私は何が欠けていますか?マップされたフィールドの内容を JDOQL メソッドの引数として使用することはできませんか? 何らかの方法で物事をエスケープする必要がありますか?

デイブ

4

2 に答える 2

1

だから私はこれを理解しましたが、JDOQLまたはdatanucleusのバグのように思えます。マップされたフィールドを matches メソッドの引数として使用すると、生成された SQL は JDOQL 構文をデータ ストア (私の場合は SQL) の構文に変換しません。したがって、上記の例で、JDOQL 構文ではなく SQL ワイルドカード構文を使用するように条件フィールドを変更すると、動作が開始されます。

具体的には、上記の例で JDOQL クエリcriteria="%StarTrek%"ではなくを使用すると、一致が開始されます。criteria=".\*StarTrek.\*"

異なるデータストアは異なる一致構文を使用する可能性があるため、これは私には正しくないように思えますが、この回避策により、私は再び動き出します...

于 2010-09-29T04:09:01.960 に答える
0

ログは、クエリに対してどの SQL が呼び出されているかを明らかに示します。また、API JDOQL と単一文字列 JDOQL を混在させている理由に対処することもできます...単一文字列を使用する場合、パラメーター/変数の定義は単一文字列にある必要があります。

于 2010-09-28T09:14:49.727 に答える