无法使用 Reactive Cassandra 访问具有复合键的 Cassandra 表

问题描述 投票:0回答:1

我正在使用 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;
    }
}

我遵循的所有文档都与我在上面所做的完全相同。我在这里错过了什么?请帮助。

java spring-boot cassandra project-reactor spring-data-cassandra
1个回答
0
投票

这对我有用:

餐桌类:

@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 接口方法。

© www.soinside.com 2019 - 2024. All rights reserved.