2014-06-10 17 views
5

Sto usando Spring Data Cassandra 1.0.0. Sono riuscito a persistere e rileggere la mia entità. Tuttavia, ora voglio fare una query che restituisce solo 1 campo dell'entità.Come richiedere solo 1 campo con Spring Data Cassandra?

Questo è quello che ho provato:

public Optional<DateTime> getTimeOfOldestIntervalTrafficDataMessage(MessageSource messageSource, IntegrationPeriod integrationPeriod, TrafficDataType trafficDataType) 
{ 
    Select select = QueryBuilder.select("message_time").from("messages", "data_message"); 
    select.where(QueryBuilder.eq("message_source_id", messageSource.getId().getId())) 
      .and(QueryBuilder.eq("data_type", trafficDataType.name())) 
      .and(QueryBuilder.eq("integration_period", integrationPeriod.name())); 

    List<Date> result = cassandraOperations.select(select, Date.class); 
    if (result.size() > 0) 
    { 
     return Optional.of(new DateTime(FluentIterable.from(result).toSortedSet(Ordering.natural()).first())); 
    } 
    else 
    { 
     return Optional.absent(); 
    } 
} 

cassandraOperations è un'istanza CassandraTemplate.

Quindi seleziono solo message_time dalla tabella data_message. Si tratta di una colonna di timestamp, così mi passa in un Date.class al metodo select(), ma questo dà la seguente eccezione:

org.springframework.data.mapping.model.MappingException: No mapping metadata found for java.util.Date 
    at org.springframework.data.cassandra.convert.MappingCassandraConverter.readRow(MappingCassandraConverter.java:111) 
    at org.springframework.data.cassandra.convert.MappingCassandraConverter.read(MappingCassandraConverter.java:202) 
    at org.springframework.data.cassandra.core.CassandraConverterRowCallback.doWith(CassandraConverterRowCallback.java:47) 
    at org.springframework.data.cassandra.core.CassandraTemplate.select(CassandraTemplate.java:455) 
    at org.springframework.data.cassandra.core.CassandraTemplate.select(CassandraTemplate.java:253) 
    at com.mycomp.app.infrastructure.cassandra.CassandraMessageRepository.getTimeOfOldestIntervalTrafficDataMessage(CassandraMessageRepository.java:130) 

Come devo eseguire una query per solo 1 campo?

PS: Se vuoi conoscere un modo più performante per fare questa domanda, sarei felice di sentirlo anche.

risposta

5

scoperto come farlo:

public Optional<DateTime> getTimeOfOldestIntervalTrafficDataMessage(MessageSource messageSource, IntegrationPeriod integrationPeriod, TrafficDataType trafficDataType) 
    { 
     Select select = QueryBuilder.select("message_time").from("messages", "data_message"); 
     select.where(QueryBuilder.eq("message_source_id", messageSource.getId().getId())) 
       .and(QueryBuilder.eq("traffic_data_type", trafficDataType.name())) 
       .and(QueryBuilder.eq("integration_period", integrationPeriod.name())); 
     select.orderBy(QueryBuilder.asc("message_time")); 
     select.limit(1); 

     Date date = m_cassandraOperations.queryForObject(select, Date.class); 
     if(date != null) 
     { 
      Optional<DateTime> result = Optional.of(new DateTime(date)); 
      logger.debug("oldest interval: {} ({}/{}/{})", result, messageSource.getName(), trafficDataType, integrationPeriod); 
      return result; 
     } 
     else 
     { 
      return Optional.absent(); 
     } 
    } 

queryForObject() funzione è la strada da percorrere. Ho anche usato l'ordine e il limite per fare in modo che Cassandra si adoperi per trovare ciò di cui ho bisogno.

+1

Sentiti libero di contrassegnare la risposta come risolta. – Ztyx

+0

Questo è corretto. –

+0

Cassandra Operations ha un metodo ---- cassandraOperations.selectOne (statement.toString(), ABC.class), possiamo usare anche questo – denzal

Problemi correlati