Java 数据存储计数查询获取选项

Java 数据存储计数查询获取选项,java,google-app-engine,google-cloud-datastore,datanucleus,Java,Google App Engine,Google Cloud Datastore,Datanucleus,我想做以下工作: PreparedQuery pq = datastore.prepare(q); int count = pq.countEntities(FetchOptions.ALL); 但并不是所有的选择。那我该怎么做呢 对于上下文,假设我要计算表中颜色为橙色的所有条目 如果我不能直接使用DatastoreService,我可以使用Datanucleus的JPA?正如在中一样,他们是否支持appengine数据存储的SELECT COUNT(*)…?您可以使用Google的DataN

我想做以下工作:

PreparedQuery pq = datastore.prepare(q);
int count = pq.countEntities(FetchOptions.ALL);
但并不是所有的选择。那我该怎么做呢

对于上下文,假设我要计算表中颜色为橙色的所有条目


如果我不能直接使用
DatastoreService
,我可以使用Datanucleus的JPA?正如在中一样,他们是否支持appengine数据存储的
SELECT COUNT(*)…

您可以使用Google的DataNucleus插件,这似乎是您可以使用以下代码计算记录的总数

com.google.appengine.api.datastore.Query qry = new com.google.appengine.api.datastore.Query("EntityName");
com.google.appengine.api.datastore.DatastoreService datastoreService = DatastoreServiceFactory.getDatastoreService();
int totalCount = datastoreService.prepare(qry).countEntities(FetchOptions.Builder.withDefaults());

我希望它能对你有所帮助。

标记的答案不正确,最多1000分

这就是如何得到正确的计数

DatastoreService ds = DatastoreServiceFactory.getDatastoreService();
 Query query = new Query("__Stat_Kind__");
 Query.Filter eqf = new Query.FilterPredicate("kind_name",
                            Query.FilterOperator.EQUAL,
                            "MY_ENTITY_KIND");
query.setFilter(eqf);
Entity entityStat = ds.prepare(query).asSingleEntity();
Long totalEntities = (Long) entityStat.getProperty("count");

这对寻求出路的新开发人员来说应该是一个老办法

最好的方法是使用分片计数器技术,当您保存在您知道会随时间扩展的实体上时,使用分片计数器在插入记录或实体组由新记录更新时获取记录总数,有了它,您可以得到计数器的总数和它们相应的计数,它们的总和将给出数据存储表或种类中total元素的实际计数

使用此链接可获得有关如何操作的帮助,为了更好地理解,请观看google i/o 2008关于扩展web应用程序的介绍,然后转到appengine上的此文档,以便快速掌握它,同时还有一个github示例测试


有关添加的示例,请使用此链接,该链接解释了一个简单的示例。

谢谢您的回复。我正在使用gae eclipse插件,datanucleus就是其中的一部分。我不明白你提供的链接是怎么说的。您介意更正以下示例吗?:
“从项目i中选择计数(*),其中i.color=:color”
。或者我的提问是否正确?我记得读过一些不支持
*
的文章,有些eclipse插件不能持久化。名为“datanucleus appengine”的jar显然是GAE所指的JPA,我已经向您链接了该插件的源代码,它表明它们支持count(),所以为什么不试试呢?谢谢+1.我还无法进行测试,但据推测,
count(p)
将起作用。
withDefaults()
是否只返回1000或某种限制?withDefaults()从实体返回总记录。是,它也返回1000多条记录,因为我已使用此代码读取了1000多条记录。1000限制确实存在,但已取消。此方法有效,但它可能会超时,具体取决于您拥有的项目数。如果可能有太多的条目,请检查数据存储统计信息,在数据存储中保留计数器,或对计数器进行切分,以获得可适当扩展的解决方案。在使用数据存储时遇到问题,如果你有帖子说它被使用了,你得到了什么异常?空指针异常,当我继续阅读时,他们说它不是最有效的,因为它不会给出记录的实时计数,它会在获得下一个总计数之前更新10小时。最好的方法是分片是和否,如果你有大量的数据,切分或映射减少类型的实时计数不是一个有效的方法。也许暂时记下每一篇文章是个更好的主意。