网络交易:查询具有项目列表的对象

时间:2014-12-08 06:24:29

标签: gridgain

在我的Java代码中,我有一个具有以下属性的对象:

class Person{
    int id;
    List<Integer> values;
}

我编写了以下查询来获取一个人的每个值的总和和平均值。

GridCacheQuery<Map.Entry<GridCacheAffinityKey<Integer>, Person>> qry=cache.queries().createSqlQuery(Person.class,"values.get(1) > ? and values.get(2) <= ?");
Iterable<Entry<GridCacheAffinityKey<Long>, Subscriber>> cols = qry.execute(1,10).get();

我知道这不是正确的查询方式,但我无法确定正确的方法。

我收到以下错误:

Caused by: org.h2.jdbc.JdbcSQLException: Syntax error in SQL statement "SELECT ""partitioned"".PERSON._KEY,""partitioned"".PERSON._VAL FROM ""partitioned"".PERSON WHERE VALUES.GET([*]1) > ? AND VALUES.GET(2) <= ? ";  
SQL statement: SELECT "partitioned".Person._key, "partitioned".Person._val FROM "partitioned".Person WHERE values.get(1) > ? and values.get(2) <= ? [42000-175]

2 个答案:

答案 0 :(得分:1)

GridGain不支持嵌入SQL查询的代码段。如果要在查询中访问列表中的这些特定元素,可以为这些元素创建访问器方法(别名),如下所示:

@GridCacheQuerySqlField
public int first() {
    return values.get(1);
}

@GridCacheQuerySqlField
public int second() {
    return values.get(2);
}

并直接在您的查询中使用它们:first > ? and second <= ?

答案 1 :(得分:1)

我认为谓词也可以为你的purpopse服务,但不确定它是否比你建议的方式更快或更慢 阿列克谢。