使用Objectify进行查询:UmbrellaException

时间:2012-10-07 23:05:45

标签: google-app-engine gwt google-cloud-datastore objectify

我正在使用Objectify为我的GWT应用管理GAE数据存储。问题是我没有正确使用查询,我得到的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。我想获得id == "cHVQP6zZiUjM"

的Box对象

我现在就是这样做的:

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中没有定义该方法(我不知道为什么)。

2 个答案:

答案 0 :(得分:3)

您的密钥已编码。尝试使用:

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

解码密钥。

答案 1 :(得分:1)

简短回答:您在实体中缺少@Id注释。

答案很长:Id字段在数据存储区中是特殊的。 id不是真实的属性,而是标识实体的Key的一部分。您无法真正过滤ID字段,但可以对名为__key__的特殊字段进行过滤。 Objectify有点聪明,让你按id字段过滤并将其转换为封面下的__key__过滤器,但如果你没有正确注释实体,它就无法做到!

实际上我有点困惑,因为Objectify不应该让你在没有@Id字段的情况下注册实体。

顺便提一下,文档有两个部分:Objectify4(即将发布)和Objectify3。由于您使用的是Ofy3,因此没有load()方法。

另一件事:当操作等效时(例如在你的例子中),按键操作是强烈优先考虑的。