问题描述
我们正在尝试使用spring-data-cosmosdb项目中的cosmostemplate实现查询。
该查询具有以下语法:"select * from movie where ARRAY_CONTAINS(movie.countries,@country)"
。
Cosmostemplate接受基于Criteria对象构建的DocumentQuery对象。 Criteria对象支持一小部分基本谓词,例如in
,or
,is equal
等,但没有array_contains
谓词。
目前,查询是通过使用cosmos客户端(来自sdk)而不是cosmostemplate来执行的。
这给我们带来了两个问题:
如何使用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连接器创建自定义查询,当前有两个选项。
首先,您可以按照本文档“自定义查询”部分中的说明进行操作
可指导您直接使用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目前不支持所有系统功能。
可以在此处找到受支持的系统功能列表:
如果您不想编写使用系统功能的查询,该查询不在上面链接的列表中,则可以使用@Query
批注或直接使用cosmos客户端代替cosmosTemplate。