如何使用Spring Data Cassandra仅查询1个字段?

Wim*_*uwe 5 java spring cassandra spring-data spring-data-cassandra

我正在使用Spring Data Cassandra 1.0.0.我设法坚持并回读我的实体.但是,现在我想做一个只返回实体的1个字段的查询.

这是我尝试过的:

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();
    }
}
Run Code Online (Sandbox Code Playgroud)

cassandraOperations是一个CassandraTemplate实例.

所以我只message_timedata_message表中选择.这是一timestamp列,所以我在传递Date.classselect()方法,但是这给了以下异常:

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)
Run Code Online (Sandbox Code Playgroud)

我该如何查询1个字段?

PS:如果您知道一种更高效的方式来进行此查询,我也很乐意听到它.

Wim*_*uwe 6

找到了怎么做:

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();
        }
    }
Run Code Online (Sandbox Code Playgroud)

queryForObject()功能是要走的路.我还使用了订购和限制让Cassandra做我需要的工作.

  • 随意将您的答案标记为已解决. (2认同)