Spring Data CosmosTemplate使用系统功能创建查询

问题描述

我们正在尝试使用spring-data-cosmosdb项目中的cosmostemplate实现查询
查询具有以下语法:
"select * from movie where ARRAY_CONTAINS(movie.countries,@country)"
Cosmostemplate接受基于Criteria对象构建的DocumentQuery对象。 Criteria对象支持一小部分基本谓词,例如inoris equal等,但没有array_contains谓词。
目前,查询是通过使用cosmos客户端(来自sdk)而不是cosmostemplate来执行的。 这给我们带来了两个问题:

  1. 我们必须通过一起使用cosmostemplate和cosmos客户端来混合代码
  2. 由于我们具有使用系统功能的复杂的参数化查询,因此必须连接SQL查询字符串并收集sql参数。

如何使用cosmostemplate处理这样的查询,甚至有可能吗?

P.S,我们正在使用com.microsoft.azure:azure-cosmosdb-spring-boot-starter:2.2.5库。

解决方法

在当前的GA版本中,您将必须像之前提到的那样同时使用客户端和模板。

最新的beta版本包括对使用存储库中带注释查询的QueryAnnotation的支持。以下是一个示例:

@Query(value = "select * from c where c.firstName = @firstName and c.lastName = @lastName")
List<User> getUsersByTitleAndValue(@Param("firstName") int firstName,@Param("lastName") String lastName);
,

拉维的答案是正确的。要直接从Spring Data连接器创建自定义查询,当前有两个选项。

首先,您可以按照本文档“自定义查询”部分中的说明进行操作

https://docs.microsoft.com/en-us/azure/developer/java/spring-framework/how-to-guides-spring-data-cosmosdb

可指导您直接使用Java SDK CosmosClient。当前GA版本的Spring Data连接器没有@Query批注,该批注将启用自定义查询批注,这就是为什么您需要直接使用Java SDK的原因。

第二,升级到启用@Query批注的最新Beta

https://mvnrepository.com/artifact/com.azure/azure-spring-data-cosmos

此示例代码将在接下来的几天内发布,并且GA版本计划在9/30发布,因此等待时间不长。

,

azure sdk中进行了研究之后,我发现cosmosTemplate目前不支持所有系统功能。
可以在此处找到受支持的系统功能列表:

https://github.com/Azure/azure-sdk-for-java/blob/master/sdk/cosmos/azure-spring-data-cosmos/src/main/java/com/azure/spring/data/cosmos/core/query/CriteriaType.java

如果您不想编写使用系统功能的查询,该查询不在上面链接的列表中,则可以使用@Query批注或直接使用cosmos客户端代替cosmosTemplate。