按键排序 - Objectify

时间:2014-04-18 07:22:37

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

我正在尝试通过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网页上查了一下,但我找不到多少。

提前致谢。

3 个答案:

答案 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-

处的Javadoc

答案 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。希望这有帮助!