Spring boot 如何使用java datastax在cassandra中允许筛选器
首先,我创建了一个表Spring boot 如何使用java datastax在cassandra中允许筛选器,spring-boot,cassandra,datastax-java-driver,Spring Boot,Cassandra,Datastax Java Driver,首先,我创建了一个表 I created a table and two indexes on it i am not able to do filter query from my spring application 然后我试图过滤显示我的错误,你必须允许过滤,虽然我已经这样做了 我的配件 CREATE INDEX IF NOT EXISTS user_name_index ON keyspace.favourite_setting (user_name) CREATE INDEX IF
I created a table and two indexes on it i am not able to do filter query from my spring application
然后我试图过滤显示我的错误,你必须允许过滤,虽然我已经这样做了
我的配件
CREATE INDEX IF NOT EXISTS user_name_index ON keyspace.favourite_setting (user_name)
CREATE INDEX IF NOT EXISTS filter_name_index ON keyspace.favourite_setting (filter_name);
@Accessor
公共接口收藏夹设置访问器{
@查询(“从收藏夹设置中选择*,其中user\u name=:userName允许筛选”)
结果getAllByUserName(@Param(“userName”)字符串userName);
}
我的服务很简单
@Accessor
public interface FavouriteSettingAccessor {
@Query("select * from favourite_setting where user_name =:userName allow filtering " )
Result<FavouriteSetting> getAllByUserName(@Param("userName") String userName );
}
@覆盖
公共列表getAllFilterNames(字符串用户名)引发异常{
session=cassandraFactory.getDataSource();
收藏夹设置访问器=
新建MappingManager(会话).createAccessor(FavoriteSettingAccessor.class);
返回FavoriteSettingAccessor.getAllByUserName(userName).all();
}
我最喜欢的布景模型
@Override
public List<FavouriteSetting> getAllFilterNames(String userName) throws Exception {
session = cassandraFactory.getDataSource();
favouriteSettingAccessor =
new MappingManager(session).createAccessor(FavouriteSettingAccessor.class);
return favouriteSettingAccessor.getAllByUserName(userName).all();
}
@Table(keyspace=“keyspace”,name=“收藏夹设置”)
公共类偏好设置{
@分区键
@列(name=“id”)
私有UUID;
@列(name=“user\u name”)
私有字符串用户名;
@列(name=“filter\u name”)
私有字符串过滤器名称;
@列(name=“columns”)
私有列表列;
@列(name=“filters”)
私有字符串过滤器;
公共收藏夹设置(UUID id、字符串用户名、字符串筛选器名称、,
列表列、字符串筛选器){
this.id=id;
this.userName=用户名;
this.filterName=filterName;
this.columns=列;
this.filters=过滤器;
}
公共偏好设置(){
}
公共UUID getId(){
返回id;
}
公共无效设置id(UUID id){
this.id=id;
}
公共字符串getFilterName(){
返回过滤器名称;
}
public void setFilterName(字符串filterName){
this.filterName=filterName;
}
公共字符串getUserName(){
返回用户名;
}
public void setUserName(字符串用户名){
this.userName=用户名;
}
公共列表getColumns(){
返回列;
}
公共void集合列(列表列){
this.columns=列;
}
公共字符串getFilters(){
回流过滤器;
}
公共void集合过滤器(字符串过滤器){
this.filters=过滤器;
}
}
无法执行此查询,因为它可能涉及数据筛选,因此可能具有不可预测的性能。如果要在性能不可预测的情况下执行此查询,请对查询使用允许筛选
@Table(keyspace = "keyspace", name = "favourite_setting")
public class FavouriteSetting {
@PartitionKey
@Column(name = "id")
private UUID id;
@Column(name = "user_name")
private String userName;
@Column(name = "filter_name")
private String filterName;
@Column(name = "columns")
private List<ColumnsDef> columns;
@Column(name = "filters")
private String filters;
public FavouriteSetting(UUID id, String userName, String filterName,
List<ColumnsDef> columns, String filters) {
this.id = id;
this.userName = userName;
this.filterName = filterName;
this.columns = columns;
this.filters = filters;
}
public FavouriteSetting() {
}
public UUID getId() {
return id;
}
public void setId(UUID id) {
this.id = id;
}
public String getFilterName() {
return filterName;
}
public void setFilterName(String filterName) {
this.filterName = filterName;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public List<ColumnsDef> getColumns() {
return columns;
}
public void setColumns(List<ColumnsDef> columns) {
this.columns = columns;
}
public String getFilters() {
return filters;
}
public void setFilters(String filters) {
this.filters = filters;
}
用户名不是主键的一部分,您可以将其设置为群集键。有关更多信息,您可以查看或
请注意,没有alter语句添加群集键,包括:
CREATE TABLE keyspace.favorite\u设置(
id uuid,
用户名文本,
过滤名称文本,
列列表,
过滤文本,
主键(id、用户名)
为username列创建的索引被认为是索引的反模式之一,因为它应该是唯一的(因此,它具有很高的基数);您可以找到有关这是一个问题的原因的更多信息
allow filtering
绝对不应该使用,正如前面解释的那样您应该抵制只向其中添加allow filtering的冲动。您应该考虑您的数据、您的模型以及您正在尝试执行的操作。
现在可以通过将用户名添加为群集键并添加到查询允许筛选的末尾来工作。。
谢谢:)我刚刚尝试添加群集密钥,但同样的原因是:java.util.concurrent.ExecutionException:com.datastax.driver.core.exceptions.InvalidQueryException:无法执行此查询,因为它可能涉及数据筛选,因此可能具有不可预测的性能。如果要在性能不可预测的情况下执行此查询,请使用“允许筛选”
@Table(keyspace = "keyspace", name = "favourite_setting")
public class FavouriteSetting {
@PartitionKey
@Column(name = "id")
private UUID id;
@Column(name = "user_name")
private String userName;
@Column(name = "filter_name")
private String filterName;
@Column(name = "columns")
private List<ColumnsDef> columns;
@Column(name = "filters")
private String filters;
public FavouriteSetting(UUID id, String userName, String filterName,
List<ColumnsDef> columns, String filters) {
this.id = id;
this.userName = userName;
this.filterName = filterName;
this.columns = columns;
this.filters = filters;
}
public FavouriteSetting() {
}
public UUID getId() {
return id;
}
public void setId(UUID id) {
this.id = id;
}
public String getFilterName() {
return filterName;
}
public void setFilterName(String filterName) {
this.filterName = filterName;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public List<ColumnsDef> getColumns() {
return columns;
}
public void setColumns(List<ColumnsDef> columns) {
this.columns = columns;
}
public String getFilters() {
return filters;
}
public void setFilters(String filters) {
this.filters = filters;
}
@Query("select * from favourite_setting where user_name =:userName ... " )
CREATE TABLE keyspace.favourite_setting (
id uuid,
user_name text,
filter_name text,
columns LIST<FROZEN<columns_def>>,
filters text,
PRIMARY KEY (id, username)