2016-11-24 54 views
0

该方法使用Slick 3.1.x,它会正确返回类型为Future[List[Analysis]]的对象,但列表始终为空。为什么是这样以及如何解决这个问题?Slick 3.1.x方法返回空列表

def readMany = { 
    val db = Database.forConfig("db1") 
    var list = new ListBuffer[Analysis]() 
    try { 
     val query = TableQuery[AnalysisDB] 
     val action = query.sortBy(_.name).result 
     val future = db.run(action).map(_.foreach { 
      case (analysis) => list += Analysis (analysis.sk, analysis.name) 
     }) 
     Future { list.toList } 
    } finally db.close 
    } 

回答

1

该列表在填充之前正在返回。您的val future(数据库调用)将被忽略/丢弃,并返回Future(list)(仍为空)。尝试这个;

def readMany = { 
    val db = Database.forConfig("db1") 
    try { 
    val query = TableQuery[AnalysisDB] 
    val action = query.sortBy(_.name).result 
    db.run(action).map(_.map { 
     a => Analysis(a.sk, a.name) 
    }) 
    } finally db.close 
} 

这也避免了臭味可变的ListBuffer。

+0

此方法会重新调用Vector而不是List。注意该动作有一个'sortyBy',这个向量可以无序访问吗? – ps0604

+0

如果你需要一个List,附加'.toList'到内部'map':'db.run(action).map(_。map {...} .toList)' 排序绝对不会丢失。 – retrospectacus