Как создать SqlQuerySpec в Java, чтобы получить список документов с заданными идентификаторами (пункт where-in)

Я работаю над 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 SqlQuerySpec, где я определил запрос «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")

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


person fascynacja    schedule 30.03.2020    source источник


Ответы (1)


Фактически, 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();

Выход:

введите здесь описание изображения

person Jay Gong    schedule 31.03.2020
comment
это отлично работает. Вверху этого вопроса: если бы у меня был список типа Long? Список ‹Long› ids = ... а есть ли способ получить данные без преобразования длинных строк в строки? - person fascynacja; 31.03.2020
comment
@fascynacja, длинный или строковый, он должен быть соответствующим. - person Jay Gong; 31.03.2020
comment
у меня это не сработало. Не могли бы вы попробовать запустить свой пример, но вместо этого List ‹String› используйте List ‹Long›? - person fascynacja; 31.03.2020
comment
@fascynacja Я думаю, идентификатор cosmos db должен быть строкой. Если вы хотите использовать Long в коде, я думаю, вам нужно преобразовать его в sql, потому что они не соответствуют друг другу. - person Jay Gong; 31.03.2020
comment
@fascynacja Если вы не хотите использовать строку, используйте long. Тогда вы можете оставить идентификатор, создать столбец идентификатора самостоятельно. Например, userId, deviceId .... - person Jay Gong; 31.03.2020
comment
на данный момент я преобразовал List ‹Long› в List ‹String›. Я подумаю о решениях, которые вы упомянули, спасибо. - person fascynacja; 31.03.2020
comment
@fascynacja Добро пожаловать! Любая проблема, пожалуйста, дайте мне знать. - person Jay Gong; 31.03.2020
comment
ошибка возникает, поскольку этот конструктор не определен. Можете ли вы помочь мне с кодом, включая зависимости от maven. - person Anuj Sharma; 13.05.2020