0

GWT アプリの GAE データストアを管理するために Objectify を使用しています。問題は、クエリを適切に使用していないことであり、以下のように UmbrellaExceptions が発生します。

Caused by: java.lang.RuntimeException: Server Error: java.lang.String cannot be cast to java.lang.Number
    at com.google.web.bindery.requestfactory.shared.Receiver.onFailure(Receiver.java:44)

Box一意のフィールドを持つクラスがあるとしますString id。Boxオブジェクトを取得したいid == "cHVQP6zZiUjM"

これは私が今それを行う方法です:

public Box getBox(String boxId)
{
    Objectify ofy = ObjectifyService.begin();
    Query<Box> q=ofy.query(Box.class).filter("id",boxId);
    Box targetBox = q.get();

    return targetBox;
}


@Entity
public class Box extends DatastoreObject{
    private String id;
    private String title;
}

ofy.load() でこれを実行しようとしましたが、そのメソッドはクラス Objectify で定義されていません (理由はわかりません)。

4

2 に答える 2

2

あなたの鍵は暗号化されています。使用してみてください:

 Box targetBox = ofy.get(Box.class, KeyFactory.stringToKey(boxId));

あなたの鍵を解読するため。

于 2012-10-07T23:10:38.577 に答える
0

簡単な答え:エンティティに@Idアノテーションがありません。

長い答え:IDフィールドはデータストアでは特別です。IDは実際のプロパティではなく、エンティティを識別するキーの一部です。idフィールドで実際にフィルタリングすることはできませんが、と呼ばれる特別なフィールドでフィルタリングすることはできます__key__。Objectifyは、idフィールドでフィルター処理し、これを内部のフィルターに変換できるようにすることについてはやや巧妙です__key__が、エンティティに適切な注釈を付けないと実行できません。

Objectifyでは@Idフィールドなしでエンティティを登録できないため、実際には少し混乱しています。

ちなみに、ドキュメントにはObjectify4(近日リリース予定)とObjectify3の2つのセクションがあります。Ofy3を使用しているため、load()メソッドはありません。

もう1つのこと:操作が同等である場合(例のように)、キーによる取得操作はクエリよりも強く推奨されます。

于 2012-10-08T16:57:17.867 に答える