我可以对属于Collection的属性执行投影查询,例如java.util.List吗?

时间:2013-09-18 00:36:42

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

若然,怎么样?

我将属性设置为一个类型:List,它在运行时只是一个我相信的List。

但是,添加投影时,我会收到不支持List的错误

query.addProjection(new PropertyProjection(“ListofLongs”,List.class);

java.lang.IllegalArgumentException: Unsupported type: interface java.util.List
    at com.google.appengine.repackaged.com.google.common.base.Preconditions.checkArgument(Preconditions.java:96)
    at com.google.appengine.api.datastore.RawValue.asType(RawValue.java:58)

我也尝试将投影属性的类传递为null,而不是尝试将RawValue传递给List ...不行。 (由于RawValue.asType触发异常,由另一个方法的stacktrace支持)

针对多值/集合属性的投影查询是否存在某种未记录的限制?

2 个答案:

答案 0 :(得分:3)

GAE数据存储肯定支持projection queries on multi-valued properties

但正如文档所述:您不会将属性作为整个列表返回,而只会将与您的查询匹配的列表值作为单独的实体返回。

基本原理:投影查询是一种“假”查询,仅使用索引并重新创建从索引中的数据返回的实体。它永远不会触及实际的实体(这是重点 - 要快)。由于多值属性(集合,数组)中的每个值都创建一个单独的索引条目,因此投影查询的结果是单独的(伪)实体。

答案 1 :(得分:0)

您必须使用列表包含的类。例如,如果您具有字符串列表属性,则应传递String.class而不是List.class。

然后,如另一个答案中所述,您将为list属性中的每个匹配值获得实体的单独副本。

https://cloud.google.com/appengine/docs/standard/java/datastore/projectionqueries#Java_Projections_and_multiple_valued_properties