Java 如何使用Spring数据Cassandra仅查询1个字段?

Java 如何使用Spring数据Cassandra仅查询1个字段?,java,spring,cassandra,spring-data,spring-data-cassandra,Java,Spring,Cassandra,Spring Data,Spring Data Cassandra,我使用的是Spring数据Cassandra 1.0.0。我已经设法坚持并读回了我的实体。但是,现在我想做一个只返回实体的1个字段的查询 这就是我尝试过的: public Optional<DateTime> getTimeOfOldestIntervalTrafficDataMessage( MessageSource messageSource, IntegrationPeriod integrationPeriod, TrafficDataType trafficDataTyp

我使用的是Spring数据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();
    }
}
如何仅查询一个字段


PS:如果您想知道一种更高效的查询方法,我也很乐意听到。

了解如何进行查询:

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();
        }
    }
public可选getTimeOfOldestIntervalTrafficDataMessage(MessageSource MessageSource,IntegrationPeriod IntegrationPeriod,TrafficDataType TrafficDataType)
{
选择Select=QueryBuilder。从(“消息”、“数据”消息)中选择(“消息时间”);
选择.where(QueryBuilder.eq(“message\u source\u id”,messageSource.getId().getId()))
和(QueryBuilder.eq(“流量数据类型”,trafficDataType.name()))
.and(QueryBuilder.eq(“integration_period”,integrationPeriod.name());
select.orderBy(QueryBuilder.asc(“message_time”);
选择。限制(1);
Date Date=m_cassandraOperations.queryForObject(选择,Date.class);
如果(日期!=null)
{
可选结果=可选。of(新日期时间(日期));
debug(“最早的间隔:{}({}/{}/{}})”,result,messageSource.getName(),trafficDataType,integrationPeriod);
返回结果;
}
其他的
{
返回可选的。缺席();
}
}

queryForObject()
函数是一种方法。我还使用了排序和限制来让Cassandra找到我需要的东西。

Cassandra Operations有一个方法——cassandraOperations.selectOne(statement.toString(),ABC.class),我们也可以使用它
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();
        }
    }