cassandra抛出的Spring数据:无法获取实体的where子句

cassandra抛出的Spring数据:无法获取实体的where子句,spring,cassandra,spring-rest,spring-data-cassandra,Spring,Cassandra,Spring Rest,Spring Data Cassandra,我试图使用Spring数据cassandra通过RESTAPI与cassandra/Scyllab通信。 我有实体 @表格 公共类事务{ @PrimaryKeyColumn(name=“id”,序号=0,类型=PrimaryKeyType.PARTITIONED) 私有字符串id; @PrimaryKeyColumn(name=“timestamp”,序号=1,类型=PrimaryKeyType.CLUSTERED) 私有即时时间戳; 私人字符串货币; } 使用存储库 @存储库 公共接口事务存

我试图使用Spring数据cassandra通过RESTAPI与cassandra/Scyllab通信。 我有实体

@表格
公共类事务{
@PrimaryKeyColumn(name=“id”,序号=0,类型=PrimaryKeyType.PARTITIONED)
私有字符串id;
@PrimaryKeyColumn(name=“timestamp”,序号=1,类型=PrimaryKeyType.CLUSTERED)
私有即时时间戳;
私人字符串货币;
}
使用存储库

@存储库
公共接口事务存储库扩展了CassandraRepository{
}
以及在REST控制器中调用的服务

@服务
公共类TransactionServiceImpl实现TransactionService{
@自动连线
私有事务存储库事务存储库;
私有事务getTransaction(字符串transactionId){
返回transactionRepository.findById(transactionId)
.orelsetrow(()->new NotFoundException(“提供了“+transactionId+”的事务不存在”);
}
}
当我调用所需的REST端点(在这里我提供了正确的transactionId)时,会引发异常

Caused by: org.springframework.dao.InvalidDataAccessApiUsageException: Cannot obtain where clauses for 
entity [com.example.dao.entity.Transaction] using [id123456]
我做了一些调查,但实体类中提供的复合键应该是有效的。我做错了什么

表格的型号:

创建表etl.transaction
(
id文本,
时间戳时间戳,
货币ascii,
主键(id、时间戳)
)
使用聚类顺序(时间戳ASC)和
默认时间为157680000;//5年在几秒钟内

我从未收到此错误消息。如果您使用setter/getter方法或使用Lombok项目并在@Table旁边添加@Data注释,您会得到什么错误消息?(如果您使用IntelliJ,则必须安装Lombok插件!)

在我的回答中,如果有任何结果,请写下评论

@数据
@桌子
公共类事务{
@PrimaryKeyColumn(name=“id”,序号=0,类型=PrimaryKeyType.PARTITIONED)
私有字符串id;
@PrimaryKeyColumn(name=“timestamp”,序号=1,类型=PrimaryKeyType.CLUSTERED)
私有即时时间戳;
私人字符串货币;
}

更新

TL;DR:如果只有一个@PrimaryKeyColumn,只需在属性上方添加@Id即可。如果使用更多@PrimaryKeyColumn,则必须使用:

  • @PrimaryKey和@PrimaryKeyClass(您可以使用findById)
public interface TestRepository扩展了CassandraRepository{
}
@数据
@桌子
公开课考试{
@主键
私钥类id;
@资料
@PrimaryKeyClass
公共静态类KeyClass{//您可以给它一个不同的名称,或者将它移动到另一个文件中。无需指定。
@PrimaryKeyColumn(name=“id”,type=PrimaryKeyType.PARTITIONED)
私有整数id;
@PrimaryKeyColumn(name=“data”)
私有整数数据;
}
}
  • 或下一个接口:
public interface TestRepository扩展了CassandraRepository{
可选findByIdAndData(整数id、整数数据);
}
@数据
@桌子
公开课考试{
@PrimaryKeyColumn(name=“id”,type=PrimaryKeyType.PARTITIONED)
私有整数id;
@PrimaryKeyColumn(name=“data”)
私有整数数据;
}

与solo
@PrimaryKeyColumn

测试数据:

public interface TestRepository扩展了CassandraRepository{
}
@数据
@桌子
公开课考试{
/*
*只能将“findById”或“findallbyd”与@Id注释一起使用。
*@PrimaryKey包含@Id本身,但ofc必须配置@PrimaryKeyClass。
*/
@PrimaryKeyColumn(name=“id”,type=PrimaryKeyType.PARTITIONED)

@Id//Hi,谢谢你的回答。我尝试了@Data Annotastation,但没有效果,是的,我安装了lombog插件。创建setters和getter方法也没有任何改变。我在最初的实现中尝试了删除anotations PrimaryKeyColumn,并用Id字段的PrimaryKey替换它,而不是时间戳字段的anotation。这很有效,但我不知道这是否是一个好的方法。文档中说,如果我做对了,我的原始实现是正确的。另外,我还有另一个实体,其中有两个分区键和一个聚集键,它工作得很好。不管是什么类型的聚集字段。它可以是即时的。
-- auto-generated definition
CREATE TABLE test
(
    id   int PRIMARY KEY,
    data int
)
    WITH CACHING = {'keys': 'ALL', 'rows_per_partition': 'NONE'}
     AND COMPACTION = {'max_threshold': '32', 'min_threshold': '4', 'class': 'org.apache.cassandra.db.compaction.SizeTieredCompactionStrategy'}
     AND COMPRESSION = {'class': 'org.apache.cassandra.io.compress.LZ4Compressor', 'chunk_length_in_kb': '64'}
     AND DCLOCAL_READ_REPAIR_CHANCE = 0.1;