【问题标题】:How to query for only 1 field with Spring Data Cassandra?如何使用 Spring Data Cassandra 仅查询 1 个字段?
【发布时间】:2014-07-31 02:03:36
【问题描述】:

我正在使用 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();
    }
}

cassandraOperations 是一个CassandraTemplate 实例。

所以我只从data_message 表中选择message_time。这是timestamp 列,因此我将Date.class 传递给select() 方法,但这会产生以下异常:

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)

我应该如何只查询 1 个字段?

PS:如果您知道执行此查询的更高效的方式,我也很乐意听到。

【问题讨论】:

    标签: java spring cassandra spring-data spring-data-cassandra


    【解决方案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( "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() 函数是要走的路。我还使用 ordering 和 limit 来让 Cassandra 完成寻找我需要的工作。

    【讨论】:

    • Cassandra Operations 有一个方法---- cassandraOperations.selectOne(statement.toString(), ABC.class),我们也可以用它
    猜你喜欢
    • 2017-05-13
    • 2017-11-12
    • 2015-11-13
    • 2016-01-08
    • 2017-12-27
    • 2021-01-09
    • 1970-01-01
    • 1970-01-01
    • 2013-05-20
    相关资源
    最近更新 更多