Java GoogleAppEngine上的JDO:如何有效地从大量记录中检索字段子集

Java GoogleAppEngine上的JDO:如何有效地从大量记录中检索字段子集,java,google-app-engine,jdo,Java,Google App Engine,Jdo,我面临一个可伸缩性的小问题。我正在使用JDO查询我的数据存储。 我需要检索给定实体的所有键(此类键的类型为Long)。考虑到在我的数据存储中,这样的实体有1.000.000条记录,我需要以一种非常有效的方式获取它们,以便在后台任务中循环这个集合 哪种方法最有效 如果我不仅需要钥匙,还需要另一个字段呢?假设我有一个名为TPImage的实体: Long idPic; //this is my key String title; //this is the field I want t

我面临一个可伸缩性的小问题。我正在使用JDO查询我的数据存储。 我需要检索给定实体的所有键(此类键的类型为Long)。考虑到在我的数据存储中,这样的实体有1.000.000条记录,我需要以一种非常有效的方式获取它们,以便在后台任务中循环这个集合

哪种方法最有效

如果我不仅需要钥匙,还需要另一个字段呢?假设我有一个名为TPImage的实体:

    Long idPic; //this is my key
    String title; //this is the field I want to retrieve together with the key
    ... // other properties
如何在一个高效的查询中检索idPic和title

差不多

    Query q = new Query("select idPic, title from " + TPImage.class.getName());
但是效率更高吗

多谢各位

再见
cghersi

您所面临的缩放问题是您需要所有的密钥,而不是您无法足够有效地获取它们。无论您使用什么系统,这都将至少是O(n)

与其尝试预取所有内容,不如分批完成工作,并使用来高效地检索下一组结果


如果需要模型中的字段,则必须检索整个模型实例-它们存储为序列化的blob,因此无法仅检索一个字段。

您的问题有两部分。对于第一部分“仅获取键”,可以通过将参数keys_only设置为True,指定在创建查询时仅返回键。 请看这里:


这将有所帮助,因为您没有检索整个实体。然而,如果您想同时处理1000000个数据,那么它可能对您的帮助还不够。在这种情况下,接受Nick的建议,将工作分解。

我修改了标题,以反映您真正需要的是数据和密钥。否则,您可以执行仅键查询。因此,讨论到此结束:blob序列化使我无法有效地只获取对象字段的子集。。。非常感谢你。