【问题标题】:Fetching row from Cassandra table with Spring使用 Spring 从 Cassandra 表中获取行
【发布时间】:2016-06-07 05:16:51
【问题描述】:

您好,我正在尝试从 Cassandra 表中获取 10 行数据。但是在每个请求上都返回相同的 10 行。请在此处查看我的逻辑。并告诉我这里哪里做错了-

 public class CustomerRequestDaoImpl implements CustomerRequestDao
 {
  private static Cluster cluster;

 @Resource
  private CassandraSessionFactory cassandraSessionFactory;

   /** The ProductsByTagDaoImpl session. */
    private Session session;

  @Override
   public List<CustomerRequest> getCustomerRequestData(final String productId, final String receiptPeriod)
  {

   final int RESULTS_PER_PAGE = 10;

   session = cassandraSessionFactory.getSession();
   final List<CustomerRequest> customerRequestdata = new ArrayList<CustomerRequest>();
   try
   {
     final PreparedStatement statement =
      session.prepare("select * from customer_request where product_id = :id and receipt_period = :receiptPeriod");

     final BoundStatement boundStatement = new BoundStatement(statement);
     boundStatement.setFetchSize(RESULTS_PER_PAGE);
     boundStatement.setString("id", productId);
     boundStatement.setString("receiptPeriod", receiptPeriod);
     final ResultSet resultSet = session.execute(boundStatement);
     final Iterator<Row> iter = resultSet.iterator();
     final PagingState nextPage = resultSet.getExecutionInfo().getPagingState();

     int remaining = resultSet.getAvailableWithoutFetching();
     for (final Row rowdt : resultSet)
     {
      customerRequestdata.add(constructCustomerReq(rowdt));
      if (--remaining == 0)
       {
         break;
       }
      }

    }
   catch (final Exception e)
    {
      e.printStackTrace();
    }
   return customerRequestdata;
  }

 @PostConstruct
  public void init()
  {
    session = cassandraSessionFactory.getSession();
    cluster = session.getCluster();

  }

}

我的桌子- 我的表结构:-

 CREATE TABLE customer_request (
  product_id varchar PRIMARY KEY,
  id varchar,
  receipt_period varchar,
  delivery_method_status varchar,
  first_name varchar
  );

返回响应-

  <e>
  <deliveryMethodStatus null="true"/>
  <firstName null="true"/>
  <id>0b0352f6b3904</id>
  <lastName Adkin="true"/>
  <orderId>FORMS8a04e</orderId>
  <orderItemId>FORMS8a04e-1</orderItemId>
  <productId>PI_NAME_CHANGE</productId>
  <receiptPeriod>2016-02-06</receiptPeriod>
  <receivedDate null="true"/>
  <requestData null="true"/>

【问题讨论】:

  • 您在receipt_period 列上有二级索引吗?因为如果没有,Cassandra 不允许您查询“where product_id = :id andreceipt_period = :receiptPeriod”
  • o 是的.. 我们在receipt_period 上有二级索引
  • @doanduyhai-先生有什么更新吗?
  • 感谢您的帮助。我唯一的疑问是如何从 UI 端第一次传递 (String pagingState) 请求?当我第一次作为 null 传递时,我在设置分页状态时遇到错误。 boundStatement.setPagingState(PagingState.fromString(pagingState));
  • 对第一次查询的 pagingState 添加一个空检查,并且不要将它注入到 boundStatement 中

标签: java spring cassandra cassandra-2.0 datastax


【解决方案1】:

几点说明:

  • 不应该每次都重新准备查询,这是 反模式。只准备一次语句,并为每个方法调用重复使用它

  • 您显示的源代码将始终返回
    的首页 数据
    因为你跳出 for 循环一次 remaining
    变量倒数到 0。PagingState 对象未使用
    任何地方...

  • 你的问题也不清楚Hello am trying to fetch 10 rows of data from Cassandra table. But on each request same 10 row is returning。你想要哪 10 行? 10 行?这 阈值后 10 行?

分页示例代码:

注意:只准备了以下查询一次select * from customer_request where product_id = :id and receipt_period = :receiptPeriod LIMIT :lim 并将其与方法一起传递

 @Override
   public List<Tuple2<String,CustomerRequest>> getCustomerRequestData(final String productId, PreparedStatement ps, final String receiptPeriod, String pagingState)
  {

   final int PAGE_SIZE = 10;

   session = cassandraSessionFactory.getSession();
   final List<CustomerRequest> customerRequestdata = new ArrayList<CustomerRequest>();
   try
   {

     final BoundStatement boundStatement = ps.bind(productId, receiptPeriod, PAGE_SIZE);
     boundStatement.setPagingState(PagingState.fromString(pagingState));
     final ResultSet resultSet = session.execute(boundStatement);
     final Iterator<Row> iter = resultSet.iterator();
     final PagingState nextPage = resultSet.getExecutionInfo().getPagingState();

     int remaining = resultSet.getAvailableWithoutFetching();
     for (final Row rowdt : resultSet)
     {
      customerRequestdata.add(constructCustomerReq(rowdt));
      if (--remaining == 0)
       {
         break;
       }
      }

    }
   catch (final Exception e)
    {
      e.printStackTrace();
    }
   return new Tuple2<>(nextPage.toString(), customerRe);

请注意使用Tuple2 类返回结果列表以及分页状态,序列化为字符串以便轻松传递给前端

【讨论】:

  • 嗨,我同意.. 我正在尝试获取每个请求的行子集。就像第一个请求想要在第二个 11-20 行上检索 1-10 行一样,在第三个请求上检索 21-30 行。你能解释一下这种情况我需要做什么吗?我对 datastax 非常陌生。如果您编辑帖子并提出建议,那将非常有帮助。感谢您回复先生。
  • 我需要将开始行和结束行作为参数传递吗?
  • 为了帮助你,我需要表结构。你能发布这个表的 CREATE TABLE 脚本吗?
  • 感谢您的帮助。我已经用表格结构更新了我的帖子。
猜你喜欢
  • 1970-01-01
  • 2012-05-24
  • 2020-08-02
  • 1970-01-01
  • 2014-12-24
  • 1970-01-01
  • 2019-04-30
  • 2014-07-28
相关资源
最近更新 更多