Spring Data Cassandra: InvalidQueryException: UUID должен быть 16 или 0 байтов (20) - PullRequest
0 голосов
/ 26 июня 2018

Entity

@Builder
@Getter @Setter
@ToString(doNotUseGetters = true)
@EqualsAndHashCode(doNotUseGetters = true)
@Table(value = "entity")
public class Entity implements Serializable {

    @PrimaryKeyColumn(name = "id", ordinal = 0, type = PrimaryKeyType.PARTITIONED)
    @CassandraType(type = DataType.Name.UUID)
    private UUID Id;

    @Column("list_name")
    @CassandraType(type = DataType.Name.TEXT)
    private String name;

    @Column("type")
    @CassandraType(type = DataType.Name.TINYINT)
    private Byte type;

Репозиторий Entity

@Repository
public interface EntityRepo extends BaseRepo<Entity, UUID> {

    @Query("SELECT * FROM entity WHERE id IN (:id)")
    Collection<ListEntity> findByIds(@Param("id") Collection<UUID> listIds);

    @Query("SELECT * FROM entity WHERE list_id = :id")
    ListEntity findById(@Param("id") UUID id);

}  

Запрос

listRepo.findByListId(UUIDs.random())
listRepo.findByListIds(Arrays.asList(UUIDs.random())

Оба результата приводят к

CassandraInvalidQueryException/InvalidQueryException
org.springframework.data.cassandra.CassandraInvalidQueryException: Query; CQL 
[SELECT * FROM lists WHERE list_id IN (?)]; UUID should be 16 or 0 bytes (20); 
nested exception is com.datastax.driver.core.exceptions.`InvalidQueryException: UUID should be 16 or 0 bytes (20)

Здесь что-то отсутствует?Может кто-нибудь помочь?

1 Ответ

0 голосов
/ 26 июня 2018

Похоже, что IN запросы с использованием UUID невозможны, если передать коллекцию в одно значение привязки.

Вот что происходит:

Spring Data преобразует ваш String-запрос

SELECT * FROM entity WHERE id IN (:id)

в нотацию Кассандры, используя аргументы позиционного запроса

SELECT * FROM entity WHERE id IN (?)

, и привязывает данный параметр к ?.Давайте превратим это в исполняемый фрагмент кода:

session.execute(new SimpleStatement("SELECT * FROM entity WHERE id IN (?)",
                                     Arrays.asList(UUIDs.random())));

Когда вы запустите этот отрывок, вы снова получите InvalidQueryException.Мы все еще можем выполнить запрос IN, но нам нужно развернуть параметры:

new SimpleStatement("SELECT * FROM entity WHERE id IN (?, ?)", UUIDs.random(), UUIDs.random())

В идеальном мире Кассандра может принять List (или Set) предметов, чтобы сохранитьнезависимость строки запроса от фактического количества аргументов.

...