我正在尝试通过Objective in Java查询App Engine数据存储。
我已经在本地存储了一些虚拟数据,但我无法实现按键排序的结果。
这些是类:
父类:
@Entity
public class Parent
{
@Getter
@Setter
@Id
long id;
@Getter
@Setter
String type;
public Parent() {
}
}
主类
@Entity
@Cache
@Index
public class MainObject
{
@Getter
@Setter
@Id
long id;
@Getter
@Setter
@Unindex
String url;
@Getter
@Setter
Date date;
@Parent
@Getter
@Setter
Key<Parent> type;
public MainObject() {
}
}
问题是我想得到这个问题:
Key<Parent> parent = Key.create(Parent.class, 1);
MainObjectlastUrl = OfyService.ofy().load().type(MainObject.class).ancestor(parent).order("-key").first().now();
返回null。
List<MainObject> list = OfyService.ofy().load().type(MainObject.class).ancestor(parent).order("-key").list();
这会返回一个空列表。
但如果删除订单查询,我会获得所有实体。
list = OfyService.ofy().load().type(MainObject.class).ancestor(parent).list();
有什么想法吗?
我已经在Objectify网页上查了一下,但我找不到多少。
提前致谢。
答案 0 :(得分:3)
神奇的Google字段表示密钥为__key__
(每边两个下划线)。这内置于GAE中,因此您需要order("-__key__")
。
Objectify可以在查询上提供orderKey(boolean)
方法,使其更加方便。如果您将其添加到问题跟踪器,我将实施它。
答案 1 :(得分:2)
从Objectify 5.0.1开始,按键排序时,您可以使用orderKey(boolean descending)
代替order("__key__")
。请参阅http://static.javadoc.io/com.googlecode.objectify/objectify/5.1.14/com/googlecode/objectify/cmd/SimpleQuery.html#orderKey-boolean-
答案 2 :(得分:1)
你要做的事情根本就是错误的。您的愿望是让您的查询返回按键排序的结果;在数据存储区中唯一标识您的实体的相同内容。我无法理解你为什么要这样做,因为密钥是使用Kind,Id和可选的父元素派生的,如果你的类有一个,因此我无法看到按密钥排序如何有用,但我相信你有理由想要这个。也许你可以通过充分解释你想要实现的目标来扩展你的问题。
现在,我将尝试回答您的问题,为什么您的查询无法返回您想要的结果并提出一些解决方案:
您的第一个查询:
MainObjectlastUrl = OfyService.ofy().load().type(MainObject.class).ancestor(parent).order("-key").first().now();
此查询返回null
的原因是因为作为key
方法排序的条件而传递的order
属性不是MainObject
的字段} 实体。当objectify尝试应用排序顺序时,它不存在并始终返回null
。
这同样适用于您的第二个查询。它返回一个空列表,因为没有带有键字段的MainObject
类型的实体。与第一个查询的唯一区别在于您专门请求实体列表而不是调用first()
。
第三个查询
list = OfyService.ofy().load().type(MainObject.class).ancestor(parent).list();
当然,这个查询是有效的,因为您正在查询所有类型为MainObject
的实体,这些实体是指定的`父对象'的祖先。实体。由于此类实体存在,查询将返回预期结果。
正如您所看到的,假设一个实体&#34;键&#34;以某种方式本质上存在作为您的实体的属性是不正确的。为了使用它按Key
排序,您需要添加一个属性key
给您的实体&#39; MainObject&#39;保持实体生成的密钥的值,这是没有意义的,绝对不推荐。
警告:可能有一种获取密钥的方法,因为我们知道它存在但我不知道。也许一些数据存储专家可以阐明这一点。
我建议您使用类的索引属性进行排序,这些属性在应用程序的域内有意义。例如按id
排序,因为它不是自动生成的,可能有一些含义; date
属性同上,因为它们可能具有某些域值,而不是key
。希望这有帮助!