我是scala的新手,仍在学习语言的复杂性。我有一个项目,我需要的所有数据都包含在一个表格中,其格式如下:
CREATE TABLE demo_data ( table_key varchar(10), description varchar(40), data_key varchar(10), data_value varchar(10) );
table_key列包含我正在搜索的主键,并且对于具有该table_key的每一行重复描述。此外,data_key和data_value对中包含描述性键和值。
我需要将一组这些data_keys合并到我生成的类中,以便类最终会像这样:
case class Tab ( tableKey: String, description: String, valA: String, valB: String, valC: String )
object Tab {
val simple = {
get[String]("table_key") ~
get[String]("description") ~
get[String]("val_a") ~
get[String]("val_b") ~
get[String]("val_c") map {
case tableKey ~ description ~ valA ~ valB ~ valC => Tab(table_key, description, valA, valB, valC)
}
}
def list(tabKey: String) : List[Tab] = {
DB.withConnection { implicit connection =>
val tabs = SQL(
"""
SELECT DISTINCT p.table_key, p.description,
a.data_value val_a,
b.data_value val_b,
c.data_value val_c
FROM demo_data p
JOIN demo_data a on p.table_key = a.table_key and a.data_key = 'A'
JOIN demo_data b on p.table_key = b.table_key and b.data_key = 'B'
JOIN demo_data c on p.table_key = c.table_key and c.data_key = 'C'
WHERE p.table_key = {tabKey}
"""
).on('tabKey -> tabKey).as(Tab.simple *)
}
return tabs
}
}
将返回我想要的内容,但是我希望以这种方式检索超过30个数据键,并且自身的连接很快变得无法管理。正如在查询中运行1.5小时并在耗尽磁盘空间之前耗尽了20GB的临时表空间。
所以我正在做一个单独的类,它使用“where'中的data_key('A','B','C',...)来检索给定表键的数据键和数据值列表” ,现在我想将返回的列表“压扁”成一个结果对象,其中包含valA,valB,valC,....我仍然想要将展平对象的列表返回给调用例程。
让我试着理想化我想要完成的事情。
获取标题结果集和详细结果集,从详细结果集中提取出键以填充标题结果集中的其他元素/属性,并生成包含标题结果的所有元素的类列表设置,以及详细结果集中的选定属性。所以我得到一个TabHeader列表(tabKey,Desc),并为每个我检索一个有趣的TabDetail(DataKey,DataValue)列表,然后我提取出DataKey =='A'的元素,并将DataValue元素放在Tab中( valA),并为DataKey =='B','C',...做同样的事情...我完成后我希望生成一个Tab(tabKey,Desc,valA,valB,valC,...)到位相应的TabHeader。我很可能在Java中混淆了这一点,但我认为这是一个学习机会,并且想知道在Scala中这样做的好方法。
我觉得使用scala映射的东西应该能够满足我的需求,但我无法确切地追踪到什么。