Для этой операции необходимо указать значение PartitionKey.

Я пытаюсь получить документ из коллекции Azure Cosmos Db. Я столкнулся с ошибкой

Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is java.lang.UnsupportedOperationException: PartitionKey value must be supplied for this operation.] with root cause
java.lang.UnsupportedOperationException: PartitionKey value must be supplied for this operation.

Я пытался найти в Интернете, как я могу предоставить значение ключа раздела для функции findById (), но похоже, что "Azure Spring data cosmosdb" не имеет возможности предоставить ключ раздела с функцией для java реализация

orderTransactionRepository.findById("id").get

person Nikhil Jain    schedule 11.02.2019    source источник


Ответы (1)


Выполнялся поиск тестовый код метода findById для секционированной коллекции, которая упоминается на домашней странице spring-data-cosmos.

@Test
    public void testFindByIdForPartitionedCollection() {
        final List<Address> addresses = repository.findByPostalCode(TestConstants.POSTAL_CODE);

        assertThat(addresses.size()).isEqualTo(2);
        assertThat(addresses.get(0).getPostalCode().equals(TestConstants.POSTAL_CODE));
        assertThat(addresses.get(1).getPostalCode().equals(TestConstants.POSTAL_CODE));
    }

Вы можете найти утверждения

Для секционированной коллекции, если вы хотите запросить записи по findById (id), будет выдано исключение.

// Incorrect for partitioned collection, exception will be thrown
   Address result = repository.findById(id);  // Caution: Works for non-partitioned collection

Вместо этого вы можете запрашивать записи по имени поля идентификатора с помощью настраиваемого запроса.

// Correct, postalCode is the ID field in Address domain
   @Repository
   public interface AddressRepository extends DocumentDbRepository<Address, String> {
      List<Address> findByPostalCode(String postalCode);
   }

   // Query
   List<Address> result = repository.findByPostalCode(postalCode);

Другим способом я обнаружил, что вы все еще можете использовать обычный sdk Document DB в пакете spring-data-cosmos, вам просто нужно инкапсулировать метод простым способом. Пожалуйста, обратитесь к этому пример кода.


Подводя итог, можно сказать, что в основном это произошло из-за того, что сообщество данных Spring изменило имя интерфейса, который реализовывала стратегия querylookup. Вам нужно вернуться к предыдущей версии cosmos-db i.e. 2.0.5! Вот ссылка с указанием проблемы github.com/Microsoft/spring-data-cosmosdb/issues/304

person Jay Gong    schedule 12.02.2019
comment
Я попытался использовать собственный запрос, но снова столкнулся с ошибкой. У метода пользовательского запроса должна быть стратегия. Я попытался создать запрос с использованием аннотации @Query, но это работает для репозитория Jpa, а не для DocumentDb. Можете ли вы сказать, какая аннотация решит эту задачу? - person Nikhil Jain; 13.02.2019
comment
Я выяснил ошибку, в основном это произошло из-за того, что сообщество данных Spring изменило имя интерфейса, который реализовывала стратегия querylookup. После возврата к предыдущей версии cosmos-db, т.е. 2.0.5. Я смог решить проблему! Вот ссылка с указанием проблемы github.com/Microsoft/spring-data-cosmosdb / issues / 304 - person Nikhil Jain; 14.02.2019
comment
@NikhilJain Это так любезно, что вы поделились, я обобщил ваше решение для ссылки на других на форуме. Большое спасибо. - person Jay Gong; 15.02.2019