Java 按键排序-对象化

Java 按键排序-对象化,java,google-app-engine,google-cloud-datastore,objectify,Java,Google App Engine,Google Cloud Datastore,Objectify,我试图通过Java中的Objective查询AppEngine数据存储 我在本地存储了一些虚拟数据,但无法获得按键排序的结果 这些是课程: 父类: @Entity public class Parent { @Getter @Setter @Id long id; @Getter @Setter String type; public Parent() { } } 主类 @Entity @Cache @Index pu

我试图通过Java中的Objective查询AppEngine数据存储

我在本地存储了一些虚拟数据,但无法获得按键排序的结果

这些是课程:

父类:

@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() {

    }
}
有什么想法吗

我已经查看了Objectify网页,但找不到太多


提前感谢。

神奇的谷歌字段,表示键是
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu。这是内置于GAE中的,因此您需要
顺序(“-\uuuuuuu-key”)


Objectify可以在查询中提供一个
orderKey(boolean)
方法,使之稍微方便一些。如果您将它添加到问题跟踪程序中,我将实现它。

您试图做的是根本错误的。您希望查询返回结果按键排序;在数据存储中唯一标识您的实体的东西。我无法理解为什么您要这样做,因为密钥是使用种类、Id和可选的父级(如果您的类有)派生的,因此我看不出这种按密钥排序的方式有什么用处,但我相信您有这样做的理由。也许你可以通过充分解释你想要实现的目标来扩展你的问题

现在,我将尝试回答您的问题,即为什么您的查询没有返回您想要的结果,并提出一些解决方案:

您的第一个查询:

MainObjectlastUrl = OfyService.ofy().load().type(MainObject.class).ancestor(parent).order("-key").first().now();
此查询返回
null
的原因是,作为要排序的
order
方法的条件传递的
key
属性不是
main对象
实体的字段。当objectify尝试应用排序顺序时,它不存在并且将始终返回
null

这同样适用于第二个查询。它返回一个空列表,因为不存在带有键字段的
MainObject
类型的实体。与第一个查询的唯一区别是,您专门请求一个实体列表,而不是调用
first()

第三个问题

list = OfyService.ofy().load().type(MainObject.class).ancestor(parent).list();
当然,此查询是有效的,因为您正在查询属于指定“父”实体祖先的
MainObject
类型的所有实体。由于这样的实体存在,查询将返回预期的结果

如您所见,假设实体的“键”以某种方式内在地作为实体的属性存在是不正确的。为了使用它,您需要将属性
Key
添加到实体“MainObject”中,以保存实体生成的键的值,这是没有意义的,也绝对不推荐使用。 注意事项:可能有一种方法可以抓住钥匙,因为我们知道它存在,但我不知道。也许一些数据存储专家可以解释这一点


我建议您使用类上的索引属性进行排序,这些属性在应用程序的域中是有意义的。例如,按
id
排序,因为它不是自动生成的,并且可能具有某种意义;
date
属性也是如此,因为它们都可能有一些域值,而不是
。希望这有帮助

从Objectify 5.0.1开始,在按键排序时,可以使用
orderKey(布尔降序)
而不是
order(“\uuuuuuuuu key”)
。首先请参见位于

的Javadoc,感谢两位的回答。这很有魅力@elcid之所以能够这样做,是因为我想通过事务性插入生成一个像SQL这样的自动递增键。谢谢PS:我将把它添加到问题跟踪程序中
list = OfyService.ofy().load().type(MainObject.class).ancestor(parent).list();
MainObjectlastUrl = OfyService.ofy().load().type(MainObject.class).ancestor(parent).order("-key").first().now();
list = OfyService.ofy().load().type(MainObject.class).ancestor(parent).list();