Java/Spring接口多实现:Cassandra仓库如何实现findById方法?
问题:Cassandra仓库中如何实现findById()方法?
我定义了如下接口:
public interface UserRepository { Optional<User> findById(UUID id); Optional<User> findByUsername(String username); void save(User user); void delete(User user); }
该接口有两个实现类:JPA仓库与Cassandra仓库。JPA的用户表包含username字段,但Cassandra的用户模型没有该字段。
JPA实现类代码如下:
@Repository("jpaUserRepository") @RequiredArgsConstructor public class JpaUserRepository implements UserRepository { private final SpringDataJpaUserRepository springDataJpaUserRepository; private final JpaUserMapper jpaUserMapper; // 其他方法实现省略 @Override public Optional<User> findByUsername(String username) { return springDataJpaUserRepository .findJpaUserEntityByUsername(username) .map(jpaUserMapper::toDomain); } // 其他方法实现省略 }
Cassandra实现类代码如下:
@Repository("cassandraUserRepository") @RequiredArgsConstructor public class CassandraUserRepository implements UserRepository { private final SpringDataCassandraUserRepository springDataCassandraUserRepository; private final CassandraUserMapper cassandraUserMapper; // 其他方法实现省略 @Override public Optional<User> findByUsername(String username) { return Optional.empty(); } // 其他方法实现省略 }
由于Cassandra的用户模型不包含username字段,请问如何在Cassandra仓库中实现findById()方法?
实现方案
Cassandra是基于主键查询的数据库,findById是根据UUID类型的主键进行查询,和username字段无关,直接借助Spring Data Cassandra的默认能力即可实现:
- 确保你的
SpringDataCassandraUserRepository继承了CassandraRepository(或ReactiveCassandraRepository),Spring Data会自动为实体的主键生成findById方法; - 在
CassandraUserRepository的findById实现中,调用底层Spring Data仓库的findById方法,再通过CassandraUserMapper将Cassandra实体转换为领域模型User即可。
具体代码实现如下:
@Override public Optional<User> findById(UUID id) { return springDataCassandraUserRepository .findById(id) .map(cassandraUserMapper::toDomain); }
如果你的SpringDataCassandraUserRepository没有自动生成findById,可以手动定义该方法(不过Spring Data Cassandra默认会根据主键生成):
public interface SpringDataCassandraUserRepository extends CassandraRepository<CassandraUserEntity, UUID> { // 无需手动定义findById,继承后自动拥有 }
内容的提问来源于stack exchange,提问作者IFUNMAN
相关产品推荐
相关产品推荐

