0

GAE-Java-JDO を使用して、リスト内の特定の要素の値をフィルタリングすることは可能ですか?

機能するもの

通常、私は次のようになります。

@PersistenceCapable
class A {

  String field1;
  String field2;

  // id, getters and setters

}

次に、簡単なクエリを作成します。

Query q = pm.newQuery(A.class, "field1 == val");
q.declareParameters("String val");
List<A> list = new ArrayList<A>((List<A>) q.execute("foo"));

私が望むもの

上記は正常に動作します。しかし、私が欲しいのは、リストに格納されているすべてのフィールドです:

@PersistenceCapable
class AA {

  ArrayList<String> fields;

  // id, getters and setters

}

次に、リスト内の特定のフィールドに対してクエリを実行できます。

int index = 0;
Query q = pm.newQuery(A.class, "fields.get(index) == val");
q.declareParameters("int index, String val");
List<A> list = new ArrayList<A>((List<A>) q.execute(index, "foo"));

しかし、これは例外をスローします:

org.datanucleus.store.appengine.query.DatastoreQuery$UnsupportedDatastoreFeatureException:
Problem with query 
<SELECT FROM xxx.AA WHERE fields.get(index) == val PARAMETERS int index, String val,>:     
Unsupported method <get> while parsing expression: 
InvokeExpression{[PrimaryExpression{strings}].get(ParameterExpression{ui})}

GAE-JDO のドキュメントを読んだ感想は、これは不可能だということです。

「プロパティ値はアプリケーションによって提供される必要があります。他のプロパティを参照したり、計算したりすることはできません」

それで...何かアイデアはありますか?

前もって感謝します!

4

1 に答える 1

0

index + valueでフィルタリングするだけでよい場合は、実際のリスト値の前にインデックスを付けるとうまくいくはずです。(実際の値でもフィルタリングする必要がある場合は、両方のリストを保存する必要があります。)

つまり、同等のものの代わりに

fields= ['foo', 'bar', 'baz]クエリフィルター付きfields[1] == 'bar'

あなたが持っているだろう

fields= ['0-foo', '1-bar', '2-baz']クエリフィルター付きfields == '1-bar'

(ただし、Javaでは)

于 2013-01-28T18:49:03.013 に答える