我正在使用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_time从 …
我正在尝试为每个列添加TTL,同时使用spring boot应用程序插入和更新数据.为此我使用spring-data-cassandra 1.1.3.RELEASE
为此,我编写了一个接口CustomTTLRepository:
@NoRepositoryBean
public interface CustomTTLRepository<T, ID extends Serializable> extends TypedIdCassandraRepository<T, ID> {
<S extends T> S save(S s, int ttl);
}
Run Code Online (Sandbox Code Playgroud)
实现CustomTTLRepositoryImpl:
@NoRepositoryBean
public class CustomTTLRepositoryImpl<T, ID extends Serializable> extends SimpleCassandraRepository<T, ID> implements CustomTTLRepository<T, ID> {
public CustomTTLRepositoryImpl(CassandraEntityInformation<T, ID> metadata, CassandraTemplate template) {
super(metadata, template);
this.entityInformation = metadata;
this.template = template;
}
@Override
public <S extends T> S save(S s, int ttl) {
WriteOptions writeOptions=new WriteOptions();
writeOptions.setTtl(ttl);
return template.insert(s, writeOptions);
}
Run Code Online (Sandbox Code Playgroud)
}
但是,当我尝试部署此应用程序时,我收到以下错误:
Caused by: java.lang.IllegalArgumentException: encountered …Run Code Online (Sandbox Code Playgroud) 我开始学习cassandra,我想连接Spring启动框架,但是我误解了很多错误.我第一次花了一整天的时间来理解我必须使用Cassandra 2.xx版本而不是3.xx,因为Spring数据Cassandra不支持它.所以我删除了maven中的任何版本并运行!我第二次和上次完全一样,但我又遇到了一些错误,难道还是什么?我什么都听不懂!请告诉我一些人.
的pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.libra</groupId>
<artifactId>libra</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>libra</name>
<description>Demo project for Spring Boot</description>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.3.3.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-cassandra</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jersey</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
Run Code Online (Sandbox Code Playgroud)
Config Cassandra
package com.libra.configs;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.cassandra.config.SchemaAction;
import org.springframework.data.cassandra.config.java.AbstractCassandraConfiguration;
import org.springframework.data.cassandra.convert.MappingCassandraConverter; …Run Code Online (Sandbox Code Playgroud) 我想创建如下模型,如何在spring-data-cassandra中使用用户定义的类型?
{
email: "test@example.com",
name: {
fname: "First",
lname: "Last"
}
}
Run Code Online (Sandbox Code Playgroud) 我一直在尝试测试Cassandra UDT的插入,并且一直遇到以下错误:线程“ main”中的异常java.lang.IllegalArgumentException:UserTypeResolver不能为null
在尝试找出自己的方式之后,我尝试完全复制以下方法: 用户定义类型与spring-data-cassandra
但是,我仍然遇到相同的错误。
当我删除UDT并仅插入简单类型时,我能够插入到目标数据库中,因此我知道连接正确。我的配置如下:
@Configuration
@PropertySource(value = { "classpath:cassandra.properties" })
//@EnableCassandraRepositories(basePackages = { "org.spring.cassandra.example.repo" })
public class CassandraConfig {
private static final Logger LOG = LoggerFactory.getLogger(CassandraConfig.class);
@Autowired
private Environment env;
@Bean
public CassandraClusterFactoryBean cluster() {
CassandraClusterFactoryBean cluster = new CassandraClusterFactoryBean();
cluster.setContactPoints(env.getProperty("cassandra.contactpoints"));
cluster.setPort(Integer.parseInt(env.getProperty("cassandra.port")));
return cluster;
}
@Bean
public CassandraMappingContext mappingContext() {
BasicCassandraMappingContext mappingContext = new BasicCassandraMappingContext();
mappingContext.setUserTypeResolver(new SimpleUserTypeResolver(cluster().getObject(), "campaign_management"));
return mappingContext;
}
@Bean
public CassandraConverter converter() {
return new MappingCassandraConverter(mappingContext());
}
@Bean
public CassandraSessionFactoryBean session() throws Exception { …Run Code Online (Sandbox Code Playgroud) 我正在使用Spring Data Cassandra,将多个参数传递给存储库方法时出现异常。任何人都可以帮助如何传递多个参数以追加和使用where子句。
我的回购方法:
@Query("select site_name,month_gen from mykeyspace.dgr_item where type='Site' and name = ?0 and dgr_date in (:list)")
public List<Object> findGen(String siteName, @Param("list") List<Date> listt);
Run Code Online (Sandbox Code Playgroud)
例外:
Caused by: java.lang.IllegalArgumentException: Either use @Param on all parameters except Pageable and Sort typed once, or none at all!
at org.springframework.util.Assert.isTrue(Assert.java:68)
at org.springframework.data.repository.query.Parameters.assertEitherAllParamAnnotatedOrNone(Parameters.java:294)
at org.springframework.data.repository.query.Parameters.<init>(Parameters.java:91)
at org.springframework.data.cassandra.repository.query.CassandraParameters.<init>(CassandraParameters.java:45)
at org.springframework.data.cassandra.repository.query.CassandraQueryMethod.createParameters(CassandraQueryMethod.java:131)
at org.springframework.data.cassandra.repository.query.CassandraQueryMethod.createParameters(CassandraQueryMethod.java:45)
at org.springframework.data.repository.query.QueryMethod.<init>(QueryMethod.java:75)
at org.springframework.data.cassandra.repository.query.CassandraQueryMethod.<init>(CassandraQueryMethod.java:64)
at org.springframework.data.cassandra.repository.support.CassandraRepositoryFactory$CassandraQueryLookupStrategy.resolveQuery(CassandraRepositoryFactory.java:152)
at org.springframework.data.repository.core.support.RepositoryFactorySupport$QueryExecutorMethodInterceptor.<init>(RepositoryFactorySupport.java:436)
at org.springframework.data.repository.core.support.RepositoryFactorySupport.getRepository(RepositoryFactorySupport.java:221)
at org.springframework.data.repository.core.support.RepositoryFactoryBeanSupport.initAndReturn(RepositoryFactoryBeanSupport.java:277)
at org.springframework.data.repository.core.support.RepositoryFactoryBeanSupport.afterPropertiesSet(RepositoryFactoryBeanSupport.java:263)
at org.springframework.data.cassandra.repository.support.CassandraRepositoryFactoryBean.afterPropertiesSet(CassandraRepositoryFactoryBean.java:76)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1687)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1624)
... 41 common …Run Code Online (Sandbox Code Playgroud) 我需要在具有以下gradle依赖的项目中使用Cassandra:
compile "org.springframework.boot:spring-boot-starter-data-cassandra"
Run Code Online (Sandbox Code Playgroud)
问题是,尽管将Cassandra AutoConfiguration类标记为从单元测试中排除,但spring仍会以某种方式尝试实例化与此依赖性相关的类。
这是我的单元测试:
import org.junit.Assert;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
import org.springframework.test.web.servlet.MockMvc;
import org.springframework.test.web.servlet.request.MockMvcRequestBuilders;
import org.springframework.test.web.servlet.result.MockMvcResultMatchers;
@RunWith( SpringRunner.class )
@SpringBootTest
@AutoConfigureMockMvc
@EnableAutoConfiguration( exclude = {
org.springframework.boot.autoconfigure.cassandra.CassandraAutoConfiguration.class,
org.springframework.boot.autoconfigure.data.cassandra.CassandraDataAutoConfiguration.class
} )
public class HealthTest {
@Autowired
private MockMvc mockMvc;
@Test
public void contextLoads() {
Assert.assertNotNull( mockMvc );
}
@Test
public void healthControllerIsUp() throws Exception {
mockMvc.perform( MockMvcRequestBuilders.get( "/health" ) )
.andExpect( MockMvcResultMatchers.status().isOk() );
}
}
Run Code Online (Sandbox Code Playgroud)
这是我得到的错误,显然是因为Spring无法实例化群集对象。
java.lang.IllegalStateException: Failed …Run Code Online (Sandbox Code Playgroud) cassandra spring-mvc-test spring-boot spring-data-cassandra spring-boot-starter
我在 cassandra 表中存储了时间戳类型列的值,格式为 2018-10-27 11:36:37.950000+0000(GMT 日期)。当我运行下面的查询来获取数据时,我得到Unable to coerce '2018-10-27 11:36:37.950000+0000' to a formatted date (long) 。
select create_date from test_table where create_date='2018-10-27 11:36:37.950000+0000' allow filtering;
Run Code Online (Sandbox Code Playgroud)
如果数据已存储在表中(格式为 2018-10-27 11:36:37.950000+0000)并且还对create_date列执行范围(>= 或 <=)操作,如何使查询工作?
我create_date='2018-10-27 11:36:37.95Z',
create_date='2018-10-27 11:36:37.95' create_date='2018-10-27 11:36:37.95'也尝试过。
是否可以对这种时间戳类型的数据进行过滤呢?
PS 使用 cqlsh 在 cassandra 表上运行查询。
我不明白如何使用 Spring Data Cassandra 实现非常简单的目标。
我想使用不同的参数值多次执行“INSERT”语句。我目前没有映射的域类,所以我使用CqlOperationsSpring Data 提供的接口。
当我刚刚使用时execute(String cql, Object... args),Cassandra 驱动程序抱怨“重新准备已准备好的查询通常是一种反模式,并且可能会影响性能。请考虑仅准备一次语句”。因为 Spring Data 使用SimplePreparedStatementCreator. 但我没有看到任何方法告诉 Spring Data 使用CachedPreparedStatementCreator它。我所看到的只是execute(PreparedStatementCreator psc)不允许我提供参数值的方法。
那么,有没有什么方法可以告诉 Spring Data 使用适当的语句缓存或实现类似的功能execute(PreparedStatementCreator, Object...)?
在开始之前:是的,SO 中也有类似的问题,但没有一个问题与我有相同的环境和设置(大多数问题与 gradle 构建有关,很多问题甚至与 Spring 无关)
此外,这很令人困惑,因为这只在尝试使用 Spring Boot 的 Cassandra 依赖项时才会发生:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-cassandra</artifactId>
</dependency>
Run Code Online (Sandbox Code Playgroud)
但是每当我尝试启动应用程序时,我每次都会遇到下一个异常!
java.lang.NoClassDefFoundError: Could not initialize class org.codehaus.groovy.vmplugin.v7.Java7
Run Code Online (Sandbox Code Playgroud)
我不明白为什么会发生这种情况,因为我什至没有使用 Gradle!我在任何 Spring Boot 项目中都使用 Maven,但只有在添加 Spring Data Cassandra 依赖项时才会出现此问题。
我以为org.codehaus.groovy在pom文件中添加依赖可以解决问题,但仍然不起作用!
正如标题所示,我在 MacOs Catalina 上安装了 JDK 14。我的 JDK 按预期与任何非 cassandra spring boot 项目中的任何其他依赖项一起工作。
spring-data-cassandra 是否需要另一个依赖项?只能与 Gradle 一起使用吗?
如果有人能帮我解决这个问题,我将非常感激。我不知道这可能是什么,并且 Cassandra 在网络上的支持非常有限。
谢谢阅读!
这是我的 POM 文件:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.3.4.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent> …Run Code Online (Sandbox Code Playgroud)