【问题标题】:Spring Data CosmosTemplate create query with System FunctionsSpring Data CosmosTemplate 使用系统函数创建查询
【发布时间】:2021-01-07 00:34:26
【问题描述】:

我们正在尝试使用 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 处理此类查询,这是否可能?

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

【问题讨论】:

    标签: java spring-data azure-cosmosdb azure-cosmosdb-sqlapi


    【解决方案1】:

    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。

    【讨论】:

      【解决方案2】:

      拉维的回答是正确的。要直接从 Spring Data 连接器创建自定义查询,目前有两种选择。

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

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

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

      其次,升级到启用@Query注解的最新测试版

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

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

      【讨论】:

        【解决方案3】:

        在当前的 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-boot 版本不兼容。升级后会试试的。
        • 我将很快发布一个包含所有新功能的示例应用程序。会让你知道。如果您接受我的回答,那就太好了! :)
        猜你喜欢
        • 1970-01-01
        • 2017-12-24
        • 2017-08-15
        • 1970-01-01
        • 2014-01-04
        • 1970-01-01
        • 2014-03-23
        • 2015-12-17
        • 1970-01-01
        相关资源
        最近更新 更多