现在,Cassandra 3.4通过自定义索引提供了LIKE运算符.
在我的使用cqlsh的测试示例中,它与SELECT * FROM table WHERE indexed_column LIKE’%VALU%’类似,可以正常工作.我已经建立了一个索引,并且它的所有功能都完美无缺.
如何在具有动态值的Java驱动程序(我正在使用3.0.2版)中执行此操作?当使用像这样的文字值时,我的查询可以使用QueryBuilder并使用PreparedStatements(PS示例,但QueryBuilder也可以使用文字值):
PreparedStatement ps = PreparedStatement("SELECT * FROM table WHERE indexed_column LIKE '%VALU%'");
但是如果我不想使用呢?在QueryBuilder或使用PreparedStatements中绑定值(例如,绑定’%VAL%’).例如.
PreparedStatement ps = PreparedStatement("SELECT * FROM table WHERE indexed_column LIKE ?");
BoundStatement boundStatement = new BoundStatement(ps);
cassandraSession.execute(boundStatement.bind('%VAL%');
我收到以下错误:
com.datastax.driver.core.exceptions.SyntaxError: line 1:53 mismatched input '?' expecting STRING_LITERAL (...test.table WHERE indexed_column LIKE [?];)
解决方法:
这是3.4中的一个错误,该错误已通过CASSANDRA-11456在C * 3.6中修复,因为您无法为LIKE运算符上的值提供绑定标记(?).如果您升级到Cassandra 3.6,则应该可以使用.