Эта проблема состоит из двух частей.
Вывод данных из базы данных в список строк.
Я бы использовал Spring SimpleJdbcOperations
для доступа к базе данных, чтобы, по крайней мере, все выглядело функционально, даже если ResultSet изменяется за кулисами.
Во-первых, несколько простых преобразований, позволяющих нам использовать замыкание для сопоставления каждой строки:
implicit def rowMapper[T<:AnyRef](func: (ResultSet)=>T) =
new ParameterizedRowMapper[T]{
override def mapRow(rs:ResultSet, row:Int):T = func(rs)
}
Тогда давайте определим структуру данных для хранения результатов. (Вы можете использовать кортеж, но определение моего собственного класса дел имеет преимущество в том, что он немного более понятен в отношении названий вещей.)
case class CategoryValue(category:String, property:String)
Теперь выберите из базы данных
val db:SimpleJdbcOperations = //get this somehow
val resultList:java.util.List[CategoryValue] =
db.query("select category, property from category_value",
{ rs:ResultSet => CategoryValue(rs.getString(1),rs.getString(2)) } )
Преобразование данных из списка строк в формат, который вы на самом деле хотите
import scala.collection.JavaConversions._
val result:Map[String,Set[String]] =
resultList.groupBy(_.category).mapValues(_.map(_.property).toSet)
(Вы можете опустить аннотации типов. Я включил их, чтобы прояснить, что происходит.)