我正在尝试使用复合主键类的Spring Data Cassandra。但是当我尝试查询数据时,我得到一个例外:
org.springframework.data.repository.query.QueryCreationException:无法为公共抽象java.util.List com.amdocs.cassandrapoc.repository.ServiceRepository.findByKey(com.amdocs.cassandrapoc.entities.Key)创建查询!原因:无法直接使用复合主键。引用复合主键的属性
这是我的代码:
@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>());
}
我做错了什么?
尝试使用CrudRepository而不是CassandraRepository:
基于CassandraRepository的存储库可以定义单个主键,使用主键类或没有主键类的复合主键。使用没有主键类的复合主键的类型必须使用MapId来声明其键值。
我遇到了同样的问题。我通过以下实现解决了这个问题。
@Repository
public interface ServiceRepository extends CassandraRepository<Service, Key> {
List<Service> findByKeyIdAndKeyTenant(UUID id, String tenant);
}
我面临同样的问题。通过使用Cassandra spring框架提供的AbstractCassandraConfiguration定义Cassandra配置,解决了这个问题。
@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
}
}