3

appengineに約5万のエンティティが保存されています。次のようなクエリを使用して、GQL管理インターフェイスを介して個々のレコードを検索できます。

SELECT * FROM Pet where __key__ = KEY( 'Pet','Fido')

しかし、JDOを介してこれのバッチバージョンを実行する方法を理解するのに問題があります。今私はこれを持っています:

    PersistenceManager pm = ...;
    for(Pet pet : pets) {
        for(String k : getAllAliases(pet)) {
            keys.add(KeyFactory.createKeyString(Pet.class.getSimpleName(), k));
        }
    }
    Query q = pm.newQuery("select from " + Pet.class.getName() + " where id == :keys");
    List<Pet> petlist = (List<Pet>) q.execute(keys);

ただし、「Fido」はGQLの場合は機能しますが、そのJava+JDOコードを使用しても何も返されません。私は何が間違っているのですか?

4

3 に答える 3

2

キーでエンティティをフェッチするためにクエリを使用しないでください。非効率的であり、取得するオブジェクトごとにクエリが必要です。代わりに、key でオブジェクトを取得します。キーによる一括フェッチは JDO でサポートされていないようですが、一度に 1 つずつキーでフェッチする方が、クエリを実行するよりもはるかに効率的です。

于 2010-03-24T14:18:10.090 に答える
1

有効な JDOQL ではないため、JDOQL のケースでは機能しない可能性があります :-P

コレクション キー = ... (キー コレクションを作成します)
クエリ q = pm.newQuery("SELECT FROM " + Pet.class.getName() + " WHERE :keys.contains(id)");

つまり、フィルターは Java 構文を使用します。

于 2010-03-18T06:26:44.977 に答える
0

http://gae-java-persistence.blogspot.com/2009/10/executing-batch-gets.html

JDOバージョンは試していませんが、JPAバージョンは機能します。

于 2010-06-24T10:00:38.230 に答える