我正在使用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"
我现在就是这样做的:
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中没有定义该方法(我不知道为什么)。
答案 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()方法。
另一件事:当操作等效时(例如在你的例子中),按键操作是强烈优先考虑的。