ПРИМЕЧАНИЕ: имена столбцов были переименованы, чтобы скрыть конфиденциальную информацию
Я пытаюсь извлечь конкретный столбец из Cassandra с помощью CassandraRepository в Spring (в основном выполняю эквивалент select distinct foo from mytable
), но продолжаю сталкиваться сошибка, при которой ColumnReader ожидает невыполненные столбцы по некоторым причинам.Вот как выглядит мой репозиторий:
package com.my.data.repositories;
import com.my.data.schemas.Mydata;
import org.springframework.data.cassandra.repository.CassandraRepository;
import org.springframework.data.cassandra.repository.Query;
import org.springframework.stereotype.Repository;
import java.util.ArrayList;
@Repository
public interface MytableRepository extends CassandraRepository<Mydata, String> {
@Query(value="SELECT * FROM mytable WHERE foo = ?0 AND bar= ?1")
Mydata getAllColumns(String foo, String bar);
@Query(value="SELECT DISTINCT foo FROM mytable")
ArrayList<Mydata> getOneColumn();
}
Первый запрос работает как ожидалось, второй выдает следующую ошибку:
2018-12-04 20:36:53.774 ERROR 9 --- [nio-8080-exec-1] o.a.c.c.C.[.[.[/].[dispatcherServlet] : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is java.lang.IllegalArgumentException: Column does not exist in Cassandra table: bar] with root cause
java.lang.IllegalArgumentException: Column does not exist in Cassandra table: bar
at org.springframework.data.cassandra.core.convert.ColumnReader.getColumnIndex(ColumnReader.java:174) ~[spring-data-cassandra-2.0.8.RELEASE.jar!/:2.0.8.RELEASE]
at org.springframework.data.cassandra.core.convert.ColumnReader.get(ColumnReader.java:63) ~[spring-data-cassandra-2.0.8.RELEASE.jar!/:2.0.8.RELEASE]
at org.springframework.data.cassandra.core.convert.ColumnReader.get(ColumnReader.java:55) ~[spring-data-cassandra-2.0.8.RELEASE.jar!/:2.0.8.RELEASE]
Схема Mydata выглядит следующим образом:
package com.my.data.schemas;
import lombok.Getter;
import lombok.Setter;
import lombok.Builder;
import org.springframework.data.cassandra.core.mapping.Column;
import org.springframework.data.cassandra.core.mapping.PrimaryKeyColumn;
import org.springframework.data.cassandra.core.mapping.Table;
import java.util.ArrayList;
import static org.springframework.data.cassandra.core.cql.PrimaryKeyType.CLUSTERED;
import static org.springframework.data.cassandra.core.cql.PrimaryKeyType.PARTITIONED;
@Setter
@Getter
@Builder
@Table("mytable")
public class Mydata {
@PrimaryKeyColumn(name = "foo", ordinal = 0, type = PARTITIONED)
private final String foo;
@PrimaryKeyColumn(name = "bar", ordinal = 1, type = CLUSTERED)
private final String bar;
@Column("baz")
private final ArrayList<String> "baz";
}
Соответствующая таблица cassandra была создана с помощью следующего предложения:
CREATE TABLE IF NOT EXISTS mytable (
foo text,
bar text,
baz set<text>,
PRIMARY KEY((foo), bar)
);
Я хочу получить список уникальных записей "foo", используя метод getOneColumn()
, не выбирая беспорядокстолбцы мне не нужны и без необходимости выполнять фильтрацию в Java для того, что я легко могу фильтровать через саму Cassandra.Вместо этого CassandraRepository продолжает пытаться обработать столбец bar
по какой-то причине, и я не могу понять, почему.Я предполагал, что столбцы, которые я не выбрал, просто будут иметь нулевое значение в схеме.Разве это не так?Как мне это исправить?