Cassandra Spring Data не позволяет напрямую запрашивать данные по составному первичному ключу - PullRequest
0 голосов
/ 25 апреля 2018

Я пытаюсь использовать Spring Data Cassandra, используя класс первичного ключа Composite.Но когда я пытаюсь запросить данные, я получаю исключение:

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>());
}

Что я сделал не так?

Ответы [ 4 ]

0 голосов
/ 01 августа 2019

Я столкнулся с той же проблемой, но решил, используя следующий стиль реализации.

@Repository
public interface ServiceRepository extends CassandraRepository<Service, Key> {

    List<Service> findByKeyTent(Key key);
    // findBy{PrimaryKey}{PrimaryKeyColumn} format
}
0 голосов
/ 12 декабря 2018

Я столкнулся с той же проблемой.Это было решено путем определения Конфигурации Cassandra с помощью 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
    }

}
0 голосов
/ 30 апреля 2019

Я столкнулся с той же проблемой.Я получил решение в моем случае с реализацией ниже.

@Repository
public interface ServiceRepository extends CassandraRepository<Service, Key> {

    List<Service> findByKeyIdAndKeyTenant(UUID id, String tenant);

}
0 голосов
/ 26 апреля 2018

Попробуйте использовать CrudRepository вместо CassandraRepository:

Репозитории на основе CassandraRepository могут определять либо один первичный ключ, либо использовать класс первичного ключа, либо составной первичный ключ без класса первичного ключа. Типы, использующие составной первичный ключ без класса первичного ключа, должны использовать MapId для объявления значения своего ключа.

Источник: https://docs.spring.io/spring-data/cassandra/docs/current/api/org/springframework/data/cassandra/repository/CassandraRepository.html

...