Java 使用Spring从Cassandra表中获取行
您好,我正在尝试从Cassandra表中获取10行数据。但在每个请求中,都返回相同的10行。请看我的逻辑。告诉我我哪里做错了-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
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
任何地方 - 你的问题也不清楚。
。你想要哪10排?第一个10行?这个 阈值后10行Hello我正在取10行 来自Cassandra表的数据。但在每个请求上,相同的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);