Cassandra Spring Data不允许我直接通过复合主键查询数据

时间:2018-04-25 14:47:43

标签: java cassandra spring-data composite-key spring-data-cassandra

我正在尝试使用复合主键类的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>());
}

我做错了什么?

4 个答案:

答案 0 :(得分:1)

尝试使用CrudRepository而不是CassandraRepository:

  

基于CassandraRepository的存储库可以定义单个主键,使用主键类或没有主键类的复合主键。使用没有主键类的复合主键的类型必须使用MapId来声明其键值。

来源:https://docs.spring.io/spring-data/cassandra/docs/current/api/org/springframework/data/cassandra/repository/CassandraRepository.html

答案 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
    }

}