首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用spring-data-cassandra在spring boot应用程序中支持TTL

使用spring-data-cassandra在spring boot应用程序中支持TTL
EN

Stack Overflow用户
提问于 2015-12-29 14:04:57
回答 2查看 6.4K关注 0票数 6

我正在尝试将TTL添加到每一列,同时使用spring boot应用程序插入和更新数据。为此,我使用spring-data-cassandra 1.1.3版本

为此,我编写了一个接口CustomTTLRepository:

代码语言:javascript
复制
@NoRepositoryBean

public interface CustomTTLRepository<T, ID extends Serializable> extends TypedIdCassandraRepository<T, ID> {

    <S extends T> S save(S s, int ttl);

}

实施CustomTTLRepositoryImpl:

代码语言:javascript
复制
@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);
    }

}

但是当我尝试部署这个应用程序时,我得到了以下错误:

代码语言:javascript
复制
Caused by: java.lang.IllegalArgumentException: encountered unsupported query parameter type [class java.lang.Object] in method public abstract java.lang.Object com.cisco.operation.CustomTTLRepository.save(java.lang.Object,int)
    at org.springframework.data.cassandra.repository.query.CassandraQueryMethod.verify(CassandraQueryMethod.java:104)
    at org.springframework.data.cassandra.repository.query.CassandraQueryMethod.<init>(CassandraQueryMethod.java:68)
    at org.springframework.data.cassandra.repository.support.CassandraRepositoryFactory$CassandraQueryLookupStrategy.resolveQuery(CassandraRepositoryFactory.java:106)
    at org.springframework.data.repository.core.support.RepositoryFactorySupport$QueryExecutorMethodInterceptor.<init>(RepositoryFactorySupport.java:369)
    at org.springframework.data.repository.core.support.RepositoryFactorySupport.getRepository(RepositoryFactorySupport.java:192)
    at org.springframework.data.repository.core.support.RepositoryFactoryBeanSupport.initAndReturn(RepositoryFactoryBeanSupport.java:239)
    at org.springframework.data.repository.core.support.RepositoryFactoryBeanSupport.afterPropertiesSet(RepositoryFactoryBeanSupport.java:225)
EN

回答 2

Stack Overflow用户

发布于 2018-12-25 01:56:07

这可能是一个提交任何帖子的旧帖子。但它帮助我完成了手头的任务。以下是对我有效的解决方案

存储库自定义基本Repository

  1. Customizing个人存储库

用于自定义基本存储库的更改

1.1。扩展CassandraRepository以添加接受TTL的保存方法

代码语言:javascript
复制
@NoRepositoryBean
public interface ExtendedCassandraRepository<T, ID> extends CassandraRepository<T, ID> {
    <S extends T> S save(S entity, int ttl);
}

1.2。为新的保存方法提供实现

代码语言:javascript
复制
public class ExtendedCassandraRepositoryImpl<T, ID> extends SimpleCassandraRepository<T, ID> implements ExtendedCassandraRepository<T, ID> {

private final CassandraEntityInformation<T, ID> entityInformation;
private final CassandraOperations operations;

public ExtendedCassandraRepositoryImpl(CassandraEntityInformation metadata, CassandraOperations operations) {
    super(metadata, operations);

    this.entityInformation = metadata;
    this.operations = operations;
}

@Override
public <S extends T> S save(S entity, int ttl) {
    InsertOptions insertOptions = org.springframework.data.cassandra.core.InsertOptions.builder().ttl(ttl).build();
    operations.insert(entity, insertOptions);
    return entity;
}
}

1.3。为我的域实体创建存储库

代码语言:javascript
复制
@Repository
public interface MyDomainEntityRepository extends ExtendedCassandraRepository<MyDomainEntity,String> {
}

1.4。更新repositoryBaseClass

代码语言:javascript
复制
@EnableCassandraRepositories(basePackages = "my.repository", repositoryBaseClass = ExtendedCassandraRepositoryImpl.class)

用于自定义单个存储库更改

2.1。使用新的save方法定义片段接口

代码语言:javascript
复制
public interface CustomizedSave<T> {
    <S extends T> S save(S entity, int ttl);
}

2.2。提供实现

代码语言:javascript
复制
public class CustomizedSaveImpl<T> implements CustomizedSave<T> {

@Autowired
private CassandraOperations operations;

@Override
public <S extends T> S save(S entity, int ttl) {
    InsertOptions insertOptions = org.springframework.data.cassandra.core.InsertOptions.builder().ttl(ttl).build();
    operations.insert(entity, insertOptions);
    return entity;
}
}

2.3。在存储库中扩展此方法

代码语言:javascript
复制
@Repository
public interface MyDomainEntityRepository extends CassandraRepository<MyDomainEntity,String>, CustomizedSave<MyDomainEntity> {
}

参考文档https://docs.spring.io/spring-data/jpa/docs/current/reference/html/#repositories.custom-implementations

票数 12
EN

Stack Overflow用户

发布于 2017-06-01 00:29:32

尽管为时已晚,但答案可能会对其他人完全有帮助,我已经尝试了CassandraOperations,它工作正常,请查看下面的存储库实现

代码语言:javascript
复制
 @Repository
 public class DomainRepository {

 @Autowired
 CassandraOperations cassandraOperations;

 @Autowired
 WriteOptions writeOptions;

 @Override
 public void save(DomainObject domainObject) {
    writeOptions.setTtl(100);
    cassandraOperations.insert(domainObject,writeOptions);
 }
}

谢谢

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34505376

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档