【问题标题】:How to filter on the value of a specific element in a list?如何过滤列表中特定元素的值?
【发布时间】:2013-01-28 18:25:28
【问题描述】:

使用 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})}

我阅读the GAE-JDO doc 的印象是这是不可能的:

“属性值必须由应用程序提供;它不能引用或根据其他属性计算”

那么...有什么想法吗?

提前致谢!

【问题讨论】:

    标签: google-app-engine jdo datanucleus


    【解决方案1】:

    如果您只需要按索引+值进行过滤,那么我认为在实际列表值前面加上它们的索引应该可以。 (如果您还需要按实际值进行过滤,则需要存储这两个列表。)

    即而不是相当于

    fields= ['foo', 'bar', 'baz] 带有查询过滤器fields[1] == 'bar'

    你应该有

    fields= ['0-foo', '1-bar', '2-baz'] 带有查询过滤器fields == '1-bar'

    (但在 java 中)

    【讨论】:

    • 不走运。我尝试声明两个参数(索引和值),但是这个查询:SELECT FROM xxx.AA WHERE fields == 'index-val' PARAMETERS String index, String val, 没有返回任何结果(当它应该返回一个时)。
    • hmm...我不明白该代码:(如果不清楚,您必须将存储的内容更改为通过组合(由您)创建的新值索引和值,没有任何自动/固有的方法可以解决问题。
    猜你喜欢
    • 1970-01-01
    • 2019-04-28
    • 1970-01-01
    • 2021-12-20
    • 2021-09-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-22
    相关资源
    最近更新 更多