2014-06-10 4 views
5

Ich verwende Spring Data Cassandra 1.0.0. Ich habe es geschafft, zu bestehen und meine Entität zurückzulesen. Jetzt möchte ich jedoch eine Abfrage ausführen, die nur 1 Feld der Entität zurückgibt. DieseWie für nur 1 Feld mit Spring Data Cassandra abfragen?

ist, was ich habe versucht:

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 ist eine CassandraTemplate Instanz.

Also ich wähle nur message_time aus der Tabelle. Dies ist eine timestamp Spalte, so gebe ich in einem Date.class zum select() Methode, aber das gibt die folgende Ausnahme:

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) 

Wie soll ich für nur 1 Feld abfragen?

PS: Wenn Sie eine leistungsfähigere Möglichkeit kennen würden, diese Abfrage durchzuführen, würde ich mich freuen, sie auch zu hören.

Antwort

5

Fand heraus, wie es geht:

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() Funktion der Weg zu gehen ist. Ich habe auch Ordnung und Limits benutzt, um Cassandra dazu zu bringen, das zu tun, was ich brauche.

+1

Fühlen Sie sich frei, Sie als Antwort zu markieren. – Ztyx

+0

Das ist richtig. –

+0

Cassandra Operations hat eine Methode ---- cassandraOperations.selectOne (statement.toString(), ABC.class), wir können das auch verwenden – denzal

Verwandte Themen