gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-31 19:55:07 26 4
gpt4 key购买 nike

我正在使用 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:如果您知道执行此查询的更高效的方法,我也很乐意听到。

最佳答案

了解如何去做:

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() 函数是要走的路。我还使用排序和限制让 Cassandra 完成寻找我需要的工作。

关于java - 如何使用 Spring Data Cassandra 仅查询 1 个字段?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24138786/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com