aliyun / aliyun-tablestore-java-sdk

Aliyun TableStore(原OTS) JAVA SDK
https://www.aliyun.com/product/ots/
Apache License 2.0
54 stars 27 forks source link

BatchGetRowResponse中RowResult isSuccess==true,但Row为null #28

Closed CharleyWuCL closed 3 years ago

CharleyWuCL commented 3 years ago

现象

使用BatchGetRow功能查询批量数据,查询一条不存在的数据,BatchGetRowResponse正常返回,取RowResult值的时候发现:isSuccess为true,但Row为null。

期望

public class BatchGetRowResponse extends Response implements Jsonizable {
    /**
     * BatchGetRow批量操作中单行查询的结果。
     * 若isSucceed为true,则代表该行查询操作成功,可以通过getRow获取单行查询的结果。
     * 若isSucceed为false,则代表该行查询操作失败,可以通过getError获取失败的错误信息。
     */
    public static class RowResult {}
}

代码

  private <T> void getBatchRow(Class<T> clazz, String table, List<PrimaryKey> pks) throws Exception {
    //读取一行数据,设置数据表名称。
    MultiRowQueryCriteria criteria = new MultiRowQueryCriteria(table);
    //设置读取最新版本。
    criteria.setMaxVersions(1);
    // 添加主键
    for(PrimaryKey pk : pks){
      criteria.addRow(pk);
    }
    // 执行查询
    BatchGetRowRequest request = new BatchGetRowRequest();
    request.addMultiRowQueryCriteria(criteria);
    BatchGetRowResponse response = client.batchGetRow(request);
    List<RowResult> rowRsts = response.getBatchGetRowResult(table);
    if (rowRsts.isEmpty()) {
      return Collections.emptyList();
    }

    for(RowResult rowRst : rowRsts){
      if(!rowRst.isSucceed()){
        continue;
      }
      Row row = rowRst.getRow();
      if(row.isEmpty()){
        continue;
      }
      System.out.println(row);
    }
  }
zhouzf05 commented 3 years ago

这是 by design 的。如果行不存在,查询操作算是执行成功的,但是返回的 row 为 null 代表该行不存在。