Как создать SqlQuerySpe c в Java для получения списка документов с заданными идентификаторами (предложение where-in) - PullRequest
1 голос
/ 30 марта 2020

Я работаю над Azure Cosmos DB с SQL Api. Я использую Azure SDK из:

<dependency>
    <groupId>com.microsoft.azure</groupId>
    <artifactId>azure-documentdb</artifactId>
    <version>2.4.7</version>
</dependency>

У меня есть список идентификаторов , и я хотел бы найти все документы с идентификаторами из своего списка , Для этого я использую Azure SDK SqlQuerySpe c, где я определил запрос «WHERE IN» следующим образом:

List<String> ids = Lists.newArrayList("1");
SqlQuerySpec spec = new SqlQuerySpec(
    "SELECT * FROM MyLog c WHERE c.id IN (@ids)", 
    new SqlParameterCollection(new SqlParameter("@ids", ids)));
FeedResponse<Document> documentFeedResponse = documentClient.queryDocuments(collectionLink, spec, queryOptions);
List<Document> documents = documentFeedResponse.getQueryIterable().toList();

Но, к сожалению, список «документов» пуст, хотя в В моей базе данных у меня есть документ с id = 1. Просто для двойной проверки я попытался выполнить запрос на портале:

SELECT * FROM c, где c .id IN ("1")

он возвращает данные правильно. Поэтому я не уверен, что я делаю неправильно. Кто-нибудь уже создал SqlQuerySpe c, чтобы получить список документов с указанными идентификаторами?

1 Ответ

0 голосов
/ 31 марта 2020

На самом деле, IN используется как where c.id IN ("1"), параметр не является массивом.

Вы можете использовать Array_Contains для реализации ваших потребностей:

List<String> ids = new ArrayList<String>();
ids.add("1");
ids.add("2");
SqlQuerySpec spec = new SqlQuerySpec(
           "SELECT * FROM c WHERE array_contains(@ids, c.id )",
           new SqlParameterCollection(new SqlParameter("@ids", ids)));
FeedResponse<Document> documentFeedResponse = documentClient.queryDocuments(collectionLink, spec, feedOptions);
            List<Document> documents = documentFeedResponse.getQueryIterable().toList();

Вывод:

enter image description here

...