如何使用 Spring Data Cassandra 仅查询 1 个字段?
Posted
技术标签:
【中文标题】如何使用 Spring Data Cassandra 仅查询 1 个字段?【英文标题】:How to query for only 1 field with Spring Data Cassandra? 【发布时间】: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:如果您知道执行此查询的更高效的方式,我也很乐意听到。
【问题讨论】:
【参考方案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),我们也可以用它以上是关于如何使用 Spring Data Cassandra 仅查询 1 个字段?的主要内容,如果未能解决你的问题,请参考以下文章
使用 Spring data mongo 和 Spring data elasticsearch 时如何建模?
如何将 @Transactional 与 Spring Data 一起使用?
使用 spring-data-jpa 获取这些数据如何更正确?
如何在 Spring Boot 应用程序的同一个域类上同时使用 Spring Data JPA 和 Spring Data Elasticsearch 存储库?
如何在 spring-boot 中禁用 spring-data-mongodb 自动配置
如何使用 spring4+spring-data-jpa(hibernateJpaVendorAdapter)+multidatasource+one entityManager+jpaReposit