在下面的Cassandra代码中,我正在查询数据库,并期望多个值。该函数接受和id并应返回Option[List[M]]
,其中M
是我的模型。我有一个函数rowToModel(row: Row): MyModel
,它可以从row
中提取一个ResultSet
并将其转换为模型实例。
我的问题是,即使List
有数据,我要返回的ResultSet
始终为空。我通过在rowToModel
def getRowsByPartitionKeyId(id:I):Option[List[M]] = {
val whereClause = whereConditions(tablename, id);
val resultSet = session.execute(whereClause) //resultSet is an iterator
val it = resultSet.iterator();
val resultList:List[M] = List();
if(it.hasNext){
while(it.hasNext) {
val item:M = rowToModel(it.next())
resultList.:+(item)
}
Some(resultList) //THIS IS ALWAYS List()
}
else
None
}
我怀疑由于resultList
是val
,因此其值在while
循环中没有被更改。我可能应该使用yield
或其他名称,但我不知道该如何使用。
答案 0 :(得分:0)
通过将Java
Iterator
转换为Scala
然后使用toList
import collection.JavaConverters._
val it = resultSet.iterator();
if(it.hasNext){
val resultSetAsList:List[Row] = asScalaIterator(it).toList
val resultSetAsModelList = resultSetAsList.map((row:Row) => rowToModel(row))
Some(resultSetAsModelList)