我有卡桑德拉表如下

create table user(
id UUID PRIMARY KEY,
firstname varchar,
secondname varchar,
emailid varchar,
);


从Java-Spring Boot Im正在尝试访问数据

Optional<User> findByEmailid(String emailId);


我收到错误说明

它要求我使用查询的“允许过滤”部分。无论如何有全局启用此功能,还是我应该更改查询/数据库结构?

最佳答案

该错误告诉您emailid不是可以在WHERE子句中进行过滤的有效列。在该列上启用ALLOW FILTERING或创建辅助索引是执行此操作的一种方法。但这两个都是非常糟糕的解决方案(因为Cassandra的工作原理是在后台进行的)。

使用Cassandra,您需要采用基于查询的建模方法。这意味着有时(通常)查询和表共享1:1的比率。如果确实需要通过电子邮件地址查询用户,则需要创建一个表来服务该查询。

CREATE TABLE user_by_email(
  id UUID,
  firstname varchar,
  secondname varchar,
  emailid varchar PRIMARY KEY,
);


然后这样的事情将工作:

Optional<UserByEmail> findByEmailid(String emailId);


而且,如果您从未打算通过user查询id表,那么确实没有理由将该列用作您的唯一主键。

09-27 21:36