2016-02-24 3 views
0

Привет, я пытаюсь получить 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(); 

    } 

}

Мои table- Моя структура таблицы: -

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

возвращение response-

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

+0

Есть ли у вас вторичный индекс на столбце receipt_period? Потому что, если нет, Cassandra не позволяет вам запрашивать «где product_id =: id и receipt_period =: receiptPeriod» – doanduyhai

+0

o да .. у нас есть вторичный индекс на receipt_period – JOGO

+0

@ doanduyhai- Сэр любое обновление? – JOGO

ответ

0

Несколько замечаний:

  • Вы не должны повторно подготовки запроса каждый раз, что это антишаблоном. Подготовить заявление только один раз и повторно использовать его для каждого вызова метода

  • Исходный код вы показываете будет всегда вернуться на первую страницу
    данных
    , потому что вы вырваться из для цикла раз 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 класса, чтобы вернуться список результатов, а также состояние подкачки, сериализованные как строка, которые должны быть легко переданы передним интерфейсом

+0

Привет, я согласен. Я пытаюсь получить подмножество строк по каждому запросу. Как и для 1-го запроса, нужно получить 1-10 рядов на вторых 11-20 строках, на третьем запросе - 21-30 строк. Не могли бы вы немного объяснить по этому сценарию, что мне нужно сделать? Я очень новичок в datastax. Было бы очень полезно, если вы отредактируете сообщение и предложите. Спасибо, что ответили сэром. – JOGO

+0

Нужно ли передавать начальную строку и конечную строку в качестве параметра? – JOGO

+0

Чтобы помочь вам, мне понадобится структура таблицы. Можете ли вы разместить сценарий CREATE TABLE для этой таблицы, пожалуйста? – doanduyhai

Смежные вопросы