0

我正在使用 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。我想得到 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 不是真实属性,而是标识实体的 Key 的一部分。您不能真正过滤 id 字段,但可以过滤名为__key__. Objectify 在让您通过 id 字段进行过滤并将其转换为幕后过滤器方面有些聪明__key__,但是如果您没有正确注释实体,它就无法做到!

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

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

另一件事:当操作等效时(如您的示例中所示),按键操作比查询更受青睐。

于 2012-10-08T16:57:17.867 回答