Anorm SQL将List折叠为类结果

时间:2015-02-12 17:41:48

标签: sql-server scala playframework anorm

请原谅详细程度。我不完全确定如何说出这个问题。

我是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映射的东西应该能够满足我的需求,但我无法确切地追踪到什么。

0 个答案:

没有答案