После прочтения статьи "Асинхронные запросы с драйвером Java" в datastax, я пытался реализовать решение, подобное тому, что описано в разделе «Пример из практики: многораздельный запрос, также известный как «клиентский SELECT...IN».
В настоящее время у меня есть код, который выглядит примерно так:
public Future<List<ResultSet>> executeMultipleAsync(final BoundStatement statement, final Object... partitionKeys) {
List<Future<ResultSet>> futures = Lists.newArrayListWithExpectedSize(partitionKeys.length);
for (Object partitionKey : partitionKeys) {
Statement bs = statement.bind(partitionKey);
futures.add(executeWithRetry(bs));
}
return Futures.successfulAsList(futures);
}
Но я хотел бы улучшить это. В запросе cql, который содержит этот BoundStatement, я хотел бы иметь что-то вроде этого:
SELECT * FROM <column_family_name> WHERE <param1> = :p1_name AND param2 = :p2_name AND <partiotion_key_name> = ?;
Я бы хотел, чтобы клиенты этого метода предоставили мне BoundStatement с уже привязанными параметрами (в данном случае два параметра) и список ключей разделов. В этом случае все, что мне нужно сделать, это привязать ключи раздела и выполнить запросы. К сожалению, когда я привязываю ключ к этому оператору, я терплю ошибку - com.datastax.driver.core.exceptions.InvalidTypeException: Invalid type for value 0 of CQL type varchar, expecting class java.lang.String but class java.lang.Long provided
. Проблема в том, что я пытаюсь привязать ключ к первому параметру, а не к последнему. Это строка, а не длинная.
Я могу решить эту проблему, либо указав имя параметра раздела, но тогда мне нужно будет получить имя через параметры метода, либо указав его индекс, который снова потребует дополнительного параметра метода. В любом случае, если я использую имя или индекс, я должен связать его с определенным типом. Например: bs.setLong("<key_name>", partitionKey);
. По какой-то причине я не могу предоставить BoundStatement интерпретировать тип последнего параметра.
Я хотел бы избежать явной передачи имени параметра и обойти проблему типа. Есть ли что-нибудь, что можно сделать?
Спасибо!