You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Azure Cosmos DB(DocumentDB)在Java中是否有@Query替代注解?

Azure Cosmos DB (DocumentDB) @Query 注解支持情况及替代方案

首先明确:Azure Cosmos DB 的原生 Java SDK(包括旧的 DocumentDB SDK)并没有提供和 JPA/SQL 驱动完全一致的 @Query 注解,不过在 Spring 生态下,Spring Data for Azure Cosmos DB 提供了类似的注解来实现自定义查询,而原生 SDK 则需要通过代码构建查询逻辑。

1. Spring Data Azure Cosmos DB 中的替代:@Query 注解

如果你在使用 Spring 框架,Spring Data for Azure Cosmos DB 确实提供了 @Query 注解,用法和 JPA 里的非常相似,你可以直接在 Repository 接口的方法上标注它,传入 Cosmos DB 的 SQL 查询语句。

举个实际的代码示例:

import com.azure.spring.data.cosmos.repository.Query;
import com.azure.spring.data.cosmos.repository.CosmosRepository;
import org.springframework.data.repository.query.Param;
import org.springframework.stereotype.Repository;
import java.util.List;

@Repository
public interface UserRepository extends CosmosRepository<User, String> {

    // 使用@Query自定义查询,参数绑定用@Param指定
    @Query("SELECT * FROM c WHERE c.email = @email")
    List<User> findByEmail(@Param("email") String email);
}

这里的@Query注解来自com.azure.spring.data.cosmos.repository.Query包,参数绑定逻辑和 JPA 完全一致,能满足你通过注解定义自定义查询的需求。

2. 原生 Azure Cosmos DB Java SDK(无 Spring)的替代方案

如果是直接使用原生 SDK(比如azure-cosmos客户端库),就需要手动构建SqlQuerySpec来执行自定义查询,没有现成的注解可以直接使用。示例代码如下:

import com.azure.cosmos.CosmosClient;
import com.azure.cosmos.CosmosClientBuilder;
import com.azure.cosmos.CosmosContainer;
import com.azure.cosmos.models.SqlQuerySpec;
import com.azure.cosmos.models.SqlParameter;
import com.azure.cosmos.util.CosmosPagedIterable;

// 初始化Cosmos客户端和目标容器
CosmosClient client = new CosmosClientBuilder()
        .endpoint("你的Cosmos DB端点")
        .key("你的Cosmos DB密钥")
        .buildClient();
CosmosContainer container = client.getDatabase("目标数据库名").getContainer("目标容器名");

// 构建自定义查询规范
String queryText = "SELECT * FROM c WHERE c.age > @age";
SqlQuerySpec querySpec = new SqlQuerySpec(queryText, 
        new SqlParameter("@age", 18));

// 执行查询并处理结果
CosmosPagedIterable<User> queryResults = container.queryItems(querySpec, null, User.class);
queryResults.forEach(user -> System.out.println("查询到用户:" + user.getName()));

这种方式需要手动创建查询规范,然后调用容器的queryItems方法执行,虽然没有注解那么简洁,但完全可以实现自定义查询的需求。

补充说明

旧的 DocumentDB SDK(比如azure-documentdb包)的逻辑和原生 SDK 类似,也是通过构建SqlQuerySpec来执行自定义查询,没有对应的注解支持。

总结一下:如果用 Spring 生态,直接用 Spring Data Cosmos DB 提供的@Query注解即可;如果用原生 SDK,就手动构建查询规范来实现自定义查询。

内容的提问来源于stack exchange,提问作者Yubraj Tamang

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 08:35:14