CosmosDB SQL API Java SDK v.4 ReadAllItems 方法不返回结果

问题描述

我在使用方法cosmos db sql api 获取结果时遇到了一些障碍:

.readAllItems(partitionKey,classtype)

.readAllItems(partitionKey,options,classtype)

我有类的扁平结构时,上述方法工作正常。我的意思是没有子类嵌套在我的模型类中。下面是类示例,它不起作用:

public class Root {
    public Root(){};

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public Subclass getSubclass () {
        return subclass;
    }

    public void setSubclass (Subclass subclass) {
        this.subclass= subclass;
    }

    private String id = "";
    private Subclass subclass= new Subclass ();
}

为了简单起见,我的子类只包含 partitionKey。

public class Subclass {

    public String getPk() { return pk; }

    public void setPk(String pk) {
        this.pk = pk;
    }

    private String pk="";
}

有了这样的“结构”,我可以轻松地在容器内创建项目,并使用适当的分区键值,但我无法仅使用 partitionKey 值再次加载它们。这是从 cosmosdb 读取它们的代码片段。

PartitionKey partitionKey = new PartitionKey("properValueWhichWorksWithNonestedClassesInsideRoot");
CosmosPagedFlux<Root> pagedFluxResponse = container.readAllItems(partitionKey,Root.class);
try {
   double totalRequestCharge = pagedFluxResponse.byPage(preferredPageSize).flatMap(fluxResponse -> {
      entities.addAll(fluxResponse.getResults());

      return Mono.just(fluxResponse.getRequestCharge());
   })
   .reduce(0.0,(x1,x2) -> x1 + x2)
   .block();

   logger.info("Query charge: {}",totalRequestCharge);
} catch(Exception err) {
         err.printstacktrace();
}

return entities;

我不太确定我是做错了什么还是错误,因为我使用了与 .queryItems(query,queryOptions,classtype) 相同的代码,它也返回 CosmosPageFlux 而不是 .readAllItems 并且它有效完全没问题。

我使用这样的依赖:

<dependency>
   <groupId>com.azure</groupId>
   <artifactId>azure-cosmos</artifactId>
   <version>LATEST</version>
</dependency>

我还使用了一些特定版本的 LATEST 而它不起作用。

解决方法

我已经在我身边进行了测试,发现了一些有趣的事情。

readAllItems 是SqlQuery 实现的一个函数,所以当我调试你的情况将分区键放在一个子属性中时,它会生成一个这样的sql:

enter image description here

所以,显然它可以得到任何响应,因此 readAllItems 的结果不返回任何响应。最好直接使用queryItems。

enter image description here