Эквивалент спецификации 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 с . Используя вы можете генерировать
CosmosQuery
type, который затем можно выполнить с помощью 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