Java 使用Spring从Cassandra表中获取行

Java 使用Spring从Cassandra表中获取行,java,spring,cassandra,cassandra-2.0,datastax,Java,Spring,Cassandra,Cassandra 2.0,Datastax,您好,我正在尝试从Cassandra表中获取10行数据。但在每个请求中,都返回相同的10行。请看我的逻辑。告诉我我哪里做错了- public class CustomerRequestDaoImpl implements CustomerRequestDao { private static Cluster cluster; @Resource private CassandraSessionFactory cassandraSessionFactory; /** The

您好,我正在尝试从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();

  }
返回响应-

  <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"/>

0b0352f6b3904
表格8A04E
表格8A04E-1
PI_名称_更改
2016-02-06
几句话:

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

  • 您显示的源代码将始终返回
    数据
    ,因为您只中断了一次for循环
    剩余的

    变量倒数为0。未使用
    PagingState
    对象
    任何地方

  • 你的问题也不清楚。
    Hello我正在取10行
    来自Cassandra表的数据。但在每个请求上,相同的10行是
    返回
    。你想要哪10排?第一个10行?这个 阈值后10行
分页的示例代码:

注意:只准备了一次以下查询:
从客户请求中选择*,其中产品id=:id和收货期限=:收货期限限制: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);
@覆盖
公共列表getCustomerRequestData(最终字符串productId、PreparedStatement ps、最终字符串receiptPeriod、字符串分页状态)
{
最终整版页面大小=10;
session=cassandraSessionFactory.getSession();
最终列表customerRequestdata=new ArrayList();
尝试
{
final BoundStatement BoundStatement=ps.bind(productId、receiptPeriod、PAGE_SIZE);
boundStatement.setPagingState(PagingState.fromString(PagingState));
最终结果集ResultSet=session.execute(boundStatement);
最终迭代器iter=resultSet.Iterator();
final PagingState nextPage=resultSet.getExecutionInfo().getPagingState();
int remaining=resultSet.getAvailableWithoutFetching();
对于(最后一行rowdt:resultSet)
{
添加(constructCustomerReq(rowdt));
如果(--剩余==0)
{
打破
}
}
}
捕获(最终异常e)
{
e、 printStackTrace();
}
返回新的Tuple2(nextPage.toString(),customerRe);

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

您好,我同意。我正在尝试获取每个请求的行子集。与第一个请求一样,我希望在第二个11-20行中检索1-10行,在第三个请求中检索21-30行。你能解释一下这个场景我需要做什么吗?我对datastax非常陌生。如果你编辑帖子并提出建议,这将非常有帮助。谢谢你的回复,先生。我需要将起始行和结束行作为参数传递吗?为了帮你,我需要表结构。你能发布这个表的创建表脚本吗?谢谢感谢您的帮助。我已经用表结构更新了我的帖子。您对列receipt\u period有二级索引吗?因为如果没有,Cassandra不允许您查询“where product\u id=:id和receipt\u period=:receiptPeriod”是的,我们在收货时有二级索引_period@doanduyhai-先生,有什么更新吗?谢谢您的帮助。我唯一的疑问是如何从UI端第一次传递(字符串pagingState)请求?当我第一次以null传递请求时,我在设置Paging state.boundStatement.setPagingState(pagingState.fromString(pagingState))时出错);为第一次查询在pagingState上添加空检查,并且不要将其插入到boundStatement中
 @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);