我正在尝试使用复合主键类的Spring Data Cassandra。但是当我尝试查询数据时,我得到一个例外:
org.springframework.data.repository.query.QueryCreationException:无法为公共摘要java.util.List创建查询com.amdocs.cassandrapoc.repository.ServiceRepository.findByKey(com.amdocs.cassandrapoc.entities。键)!原因:无法直接使用复合主键。引用复合主键的属性
这是我的代码:
@PrimaryKeyClass
public class Key implements Serializable {
@PrimaryKeyColumn(name = "id", ordinal = 0, type =
PrimaryKeyType.PARTITIONED)
@CassandraType(type = DataType.Name.UUID)
private UUID id;
@PrimaryKeyColumn(name = "tenant", ordinal = 1, type =
PrimaryKeyType.PARTITIONED)
@CassandraType(type = DataType.Name.TEXT)
private String tenant;
(Equals, hashcode, getters, setters omitted)
}
Table(value = "service")
public class Service implements Serializable {
@PrimaryKey
private Key key;
@Column
private String value;
(constructors, setters, getters omitted)
}
@Repository
public interface ServiceRepository extends CassandraRepository<Service, Key> {
List<Service> findByKey(Key key);
}
这就是我创建表格的方式(使用嵌入式Cassandra和junit):
@Autowired
private CassandraAdminOperations adminTemplate;
private final String DATA_TABLE_NAME = "service";
@Before
public void createTable() {
adminTemplate.createTable(
true, CqlIdentifier.of(DATA_TABLE_NAME),
Service.class, new HashMap<String, Object>());
}
我做错了什么?
答案 0 :(得分:1)
尝试使用CrudRepository而不是CassandraRepository:
基于CassandraRepository的存储库可以定义单个主键,使用主键类或没有主键类的复合主键。使用没有主键类的复合主键的类型必须使用MapId来声明其键值。
答案 1 :(得分:1)
我遇到了同样的问题。我可以通过以下实现解决它。
/**
* @Route("/api/product/update/{id}", name="product_udpate", methods = {"PUT"}, defaults={"id"=null})
*/
答案 2 :(得分:1)
我遇到了同样的问题,但是使用以下实现方式解决了问题。
@Repository
public interface ServiceRepository extends CassandraRepository<Service, Key> {
List<Service> findByKeyTent(Key key);
// findBy{PrimaryKey}{PrimaryKeyColumn} format
}
答案 3 :(得分:0)
我面临着同样的问题。这是通过使用Cassandra spring框架提供的AbstractCassandraConfiguration定义Cassandra Configuration来解决的。
@Configuration
@EnableCassandraRepositories(basePackages = "A.B.Z") // package location of repository
@ComponentScan(value = "X.Y.X") // enable autowire
public class CassandraConfiguration extends AbstractCassandraConfiguration {
public String getContactPoints() {
return "HOTNAME OF CASSANDRA CLUSTER"; // your cluster host
}
@Override
protected int getPort() {
return 9042; //default port
}
@Override
protected String getKeyspaceName() {
return "YOUR KEY SPACE NAME"; // Cassandra Keyspace Name
}
}