我正在使用 Spring-Reactive 和 Reactive-Cassandra [spring-boot-starter-data-cassandra-reactive] 来访问 Cassandra 上的表。我能够访问具有代表主键的单个列的简单表,例如:
user_name: partition_key
address: regular
但是当涉及到如下更复杂的表时,我无法从 Cassandra 获取任何信息:
user_name: partition_key
department_name: clustering
address: regular
以下是我在 Spring 反应中编写 @Configuration 和 @Repository 的方式:
配置:
@AllArgsConstructor
@Table(value = "user_table")
public class UserConfig {
@Getter
@PrimaryKey
private UserKey key;
@Column("address")
@Getter
private String address;
}
主键类:
@Getter
@PrimaryKeyClass
@AllArgsConstructor
public class UserKey {
@PrimaryKeyColumn(name = "user_name", ordinal = 0, type = PrimaryKeyType.PARTITIONED)
private String userName;
@PrimaryKeyColumn(name = "department_name", ordinal = 1, type = PrimaryKeyType.CLUSTERED)
private String departmentName;
}
资料库:
@Repository
public interface UserRepository extends ReactiveCassandraRepository<UserConfig, UserKey> {
Mono<UserConfig> findByKeyUserNameAndKeyDepartmentName(String userName, String departmentName);
}
我的Cassandra配置类如下:
@Configuration
@EnableReactiveCassandraRepositories
public class CassandraConfig extends AbstractReactiveCassandraConfiguration {
@Value("${spring.cassandra.contact-points}")
private String contactPoints;
@Value("${spring.cassandra.local-datacenter}")
private String localDatacenter;
@Value("${spring.cassandra.port}")
private int port;
@Value("${spring.cassandra.keyspace-name}")
private String keySpace;
@Value("${spring.cassandra.username}")
private String username;
@Value("${spring.cassandra.password}")
private String password;
@Value("${spring.cassandra.schema-action}")
private SchemaAction schemaAction;
@Override
protected String getContactPoints() {
return contactPoints;
}
@Override
protected int getPort() {
return port;
}
@Override
public SchemaAction getSchemaAction() {
return schemaAction;
}
@Override
protected String getKeyspaceName() {
return keySpace;
}
@Bean
@Override
public CqlSessionFactoryBean cassandraSession() {
CqlSessionFactoryBean cqlSessionFactoryBean = new CqlSessionFactoryBean();
cqlSessionFactoryBean.setUsername(username);
cqlSessionFactoryBean.setPassword(password);
cqlSessionFactoryBean.setKeyspaceName(keySpace);
cqlSessionFactoryBean.setLocalDatacenter(localDatacenter);
cqlSessionFactoryBean.setPort(port);
cqlSessionFactoryBean.setContactPoints(contactPoints);
return cqlSessionFactoryBean;
}
}
我遵循的所有文档都与我在上面所做的完全相同。我在这里错过了什么?请帮助。
这对我有用:
餐桌类:
@Data
@AllArgsConstructor
@Table(value = "user_table")
public class UserConfig implements Serializable {
@PrimaryKeyColumn(name = "user_name", ordinal = 0, type = PrimaryKeyType.PARTITIONED)
private String userName;
@PrimaryKeyColumn(name = "department_name", ordinal = 1, type = PrimaryKeyType.CLUSTERED, ordering = Ordering.ASCENDING)
private String departmentName;
@Column(value = "address")
private String address;
}
资料库:
@Repository
public interface UserRepository extends ReactiveCassandraRepository<UserConfig, String> {
@Query("SELECT * from user_table where user_name=?0")
Flux<UserConfig> findByUserName(String userName);
@Query("SELECT * from user_table where user_name=?0 and department_name=?1")
Flux<UserConfig> findByUserNameAndDepartmentName(String userName, String departmentName);
}
这里的变化主要是关于如何使用@Query 定义 Repository 接口方法。