Эквивалент спецификации Jpa для CosmosDb

Я пытаюсь перенести приложение весенней загрузки с mssql на CosmosDb.

У нас есть приведенная ниже реализация репозитория с использованием org.springframework.data.jpa.domain.Specification; который может извлекать данные на основе любого (одного или нескольких) столбцов, запрошенных пользователем.

      static Specification<Restaurant> isMatching(final Map<String, String> parameters) {
    return new Specification<Restaurant>() {
        private static final long serialVersionUID = 1L;

        public Predicate toPredicate(Root<Restaurant> root, CriteriaQuery<?> query, CriteriaBuilder builder) {
            List<Predicate> predicates = new ArrayList<>();
            parameters.entrySet().forEach(e -> {
                
                predicates.add(builder.and(builder.equal(root.get(e.getKey()), e.getValue())));
            });
            return builder.and(predicates.toArray(new Predicate[predicates.size()]));
        }
    };
}

а затем мы вызываем это, как показано ниже:

      repo.findAll(UserRepo.isMatching(parameters));

Мне пришлось удалить spring-boot-starter-data-jpa из пути к классам, так как он не поддерживает CosmosDb. Я использую приведенные ниже весенние и весенние ссылки на космос данных в пути к классам, так как это единственная комбинация, которая работает для меня.

          <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.3.3.RELEASE</version>
        <relativePath />
    </parent>
<dependency>
            <groupId>com.azure</groupId>
            <artifactId>azure-spring-data-cosmos</artifactId>
            <version>3.0.0</version>
        </dependency>

Я не мог понять, как реализовать приведенную выше логику спецификации для CosmosDb. Я был бы очень признателен за любые рекомендации по этому поводу. Заранее спасибо!

1 ответ

В настоящее время azure-spring-data-cosmos не поддерживает спецификацию/QueryDSL в SDK azure-spring-data-cosmos. Самый близкий вариант, который я могу придумать, — это использовать Criteria API с . Используя вы можете генерировать CosmosQuerytype, который затем можно выполнить с помощью CosmosTemplate или ReactiveCosmosTemplate в зависимости от стиля вашего репозитория (синхронизация или асинхронность).

Что касается управления версиями, я бы рекомендовал использовать последнюю версию spring-boot-starter-parent — 2.6.2 и azure-spring-data-cosmos 3.17.0, чтобы вы также получили последние функции аннотации запросов.

Если SqlQuerySpecтоже не работает, альтернативой было бы получить CosmosClientфасоль через applicationContextв своем приложении spring и выполняя запросы непосредственно к azure-cosmos Java v4 SDK, который используется в составе нашего azure-spring-data-cosmos SDK.

Пожалуйста, следуйте этой проблеме github для любых обновлений по вашему вопросу - https://github.com/Azure/azure-sdk-for-java/issues/25629

Другие вопросы по тегам