用java在google app engine中查询密钥列表和引用密钥

用java在google app engine中查询密钥列表和引用密钥,java,google-app-engine,google-cloud-datastore,Java,Google App Engine,Google Cloud Datastore,我正在尝试查询具有键列表和参照键的对象,如下所示: //s is a datastore key Query q2 = pm.newQuery(Stream_Result.class,":p.contains(key) && stream == " + KeyFactory.keyToString(s)); ArrayList<List<Stream_Result> stream_r_list = (List<Stream_Result>) q2.

我正在尝试查询具有键列表和参照键的对象,如下所示:

//s is a datastore key
Query q2 = pm.newQuery(Stream_Result.class,":p.contains(key) && stream == " + KeyFactory.keyToString(s));

ArrayList<List<Stream_Result> stream_r_list = (List<Stream_Result>) q2.execute(Arrays.asList(cr.getStreamResults().toArray()))

如何处理此问题?

不应通过向查询字符串附加参数值来构造查询字符串。而是使用一个查询字符串,在其中指示参数(位置),然后执行参数化的查询,并将参数值传递给execute方法q2.setFilter(“:p1.contains(key)”);“”q2.setFilter(“stream==streamParam”);“”q2.declareParameters(“com.google.appengine.api.datastore.Key streamParam”);''q2.execute(Arrays.asList(cr.getStreamResults().toArray()),s);'但每当我这样做时,我都会得到错误“查询需要1个参数,但提供了2个值”。我不知道这有什么问题。您会收到错误消息:“查询需要1个参数,但提供了2个值。”因为您将2个参数传递给
execute()
方法:a
List
s;但是您只声明了一个
参数!我还需要使用
contains()
方法从代码中的键列表中查询对象的主键。如果我在
execute()
方法中仅放置
s,则会出现另一个错误:
为查询定义了显式参数,但找到了隐式参数语法(“:p1”)
您应该再次检查查询文档。在查询字符串中指定参数有两种方法:按索引和按名称。看起来你把这两者混在一起了。您的思路是正确的,只需查看文档,了解如何准确地指定参数。
org.datanucleus.store.appengine.query.DatastoreQuery$UnsupportedDatastoreFeatureException:

Right side of expression is composed of unsupported components.  Left: org.datanucleus.query.expression.VariableExpression, Op:  - , Right: VariableExpression{dIBDA}