我可以对集合的属性(如java.util.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 转换为列表......不去。(并且由于 RawValue.asType 触发异常,其他方法上的堆栈跟踪支持)

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

GAE 数据存储绝对支持对多值属性的投影查询。

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

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

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

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

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

最新更新