2016-11-24 2 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

이 메서드는 List 대신 Vector를 반환합니다. 액션에는 'sortyBy'가 있습니다.이 순서는 벡터가 순서없이 액세스 될 수있는 기회입니까? – ps0604

+0

List가 필요한 경우, 내부의'map'에'.toList'를 추가하십시오 :'db.run (action) .map (_. map {...}. toList)' 주문은 확실히 잃어지지 않을 것입니다. – retrospectacus

관련 문제