将从cassandra表中选择一组记录。
select a1,a2,a3 from tableB where solr_query='...';
某些a1(int
类型)为空。
nvl(a1,0)
。isnull(a1,0)
。我不知道以cassandra的方式处理。
创建TableBObject
类,其中所有属性都使用tableB
(cassandra表)进行映射。
使用访问器方法
创建Java访问器接口@Accessor
public interface TableBAccessor
{
@Query(select a1,a2,a3 from tableB where solr_query='...';)
Result<TableBObject> getTableOnSolrQuery (@Param("solrQuery") String solrQuery);
}
在我的调用方法中,我创建了mappingManager
并使用了:
TableBAccessor tableBAccessor = mappingManager.createAccessor();
List<TableBObject> tabBList = tableBAccessor.getTableOnSolrQuery("someSolrQuery").all();
for(TableBObject tabB : tabBList){
int a1 = tabB.getA1(); /*a1 column in cassandra table*/
if(a1!=null){
// replace a1 by some int value (zero / something else)
}
}
上面,我在Java中处理相同的问题。
我正在为此付出额外的努力。
cassandra
中的解决方案除了在Java
代码中处理相同内容外,还有什么解决方案?
select isnull(a1,0),a2,a3 from tableB where solr_query='...';
或
select nvl(a1,0),a2,a3 from tableB where solr_query='...';
...
如果是,那么 如何 ?如果不,那么 为什么 ?
答案 0 :(得分:2)
Cassandra中没有像nvl
这样的函数的内置支持。
理论上,自从Cassandra 2.2你可以定义一个UDF(用户定义的函数)来完成你想要的东西;但是,目前无法调用将文字作为参数传递的函数,因此nvl(a1,0)
会抛出错误;此限制将随CASSANDRA-10783而消失。
同时,你应该首先避免存储空值,或者应用客户端函数。
答案 1 :(得分:1)
我发现here Cassandra不支持基于null的查询,即使对于二级索引也是如此。
您可能需要根据您的情况调整给定的解决方案:将另一个名为a1_uninitialized
的布尔列默认为true
,这将帮助您处理空值。