2017-08-11 51 views
0

使用点燃C++ API,我试图找到一种方法来执行一个SqlFieldsQuery来选择一个特定的字段,但想要为一组键。要做到这一点Ignite SqlFieldsQuery特定键

的方法之一,就是做这样的SqlFieldsQuery,

SqlFieldsQuery("select field from Table where _key in (" + keys_string + ")") 

其中keys_string是关键作为一个逗号分隔字符串列表。

不幸的是,与仅为密钥集合keys相比,这需要很长时间。

是否有另一种更快的方式从点火高速缓存获取一组密钥的特定字段?

编辑:

看完了答案,我试图改变查询:

auto query = SqlFieldsQuery("select field from Table t join table(_key bigint = ?) i on t._key = i._key") 

然后我从我的组键添加的参数是这样的:

for(const auto& key: keys) query.AddArgument(key); 

但运行查询时,出现错误:

Failed to bind parameter [idx=2, obj=159957, stmt=prep0: select field from Table t join table(_key bigint = ?) i on t._key = i._key {1: 159956}]

显然,这不起作用,因为只有一个'?'。

于是,我又试图通过按键的vector<int64_t>,但我得到了这基本上说,std::vector<int64_t>没有专门的点火BinaryType错误。所以我按照here的定义做了这个。当呼叫例如

writer.WriteInt64Array("data", data.data(), data.size()) 

我给这个字段指定了一个任意的名字“data”。然后,这将导致错误:

Failed to run map query remotely.

不幸的是,C++ API既不是有据可查的,也不是完整的,所以我不知道如果我失去了一些东西,或者该API不允许传递一个数组作为参数SqlFieldsQuery

+0

你不能传递一个数组作为C++中的参数呢。为什么你想使用查询,如果你可以使用'GetAll()'? – isapego

+0

由于带宽限制,我被告知查询特定字段可能比获取整个对象更快。 – Grieverheart

回答

1

运算符“IN”的查询不总是使用索引。作为一种变通方法,您可以通过以下方式重写查询:

select field from Table t join table(id bigint = ?) i on t.id = i.id 

,然后调用它像:

new SqlFieldsQuery(
     "select field from Table t join table(id bigint = ?) i on t.id = i.id") 
     .setArgs(new Object[]{ new Integer[] {2, 3, 4} }))