2017-07-20 141 views
0

我有一个案例类。斯卡拉案例分类数组

case class Tax(state: String, code: String, pr: String, lic: String) 

我使用playframework从H2数据库查询数据。该查询返回多个列。以下是表结构。

Create table t(key bigint primary key, state1 varchar(10), code1 varchar(15), pr1 varchar(1), lic1 varchar(10), state2 varchar(10), code2 varchar(15), pr2 varchar(1), lic2 varchar(10), state3 varchar(10), code3 varchar(15), pr3 varchar(1), lic3 varchar(10), state4 varchar(10), code4 varchar(15), pr4 varchar(1), lic4 varchar(10)); 

我想创建案例类的数组/列表,并有4种行。

val taxes= List[Tax] 
    if (rs.next()) { 
    var a=1 
    while (!Option(rs.getString("state"+a)).getOrElse("").isEmpty){ 

     val tax = Taxonomy(rs.getString("state"+a),rs.getString("code"+a),rs.getString("pr"+a),rs.getString("lic"+a)) 
     //taxonomies = taxonomy Here I want to create array/list of taxonomy 
     a = a + 1 
     return taxonomy 
    } 
    } 
} finally { 
    conn.close() 
} 
+0

首先看看它可用于 – cchantep

+0

的DB库你看着Doobie(https://github.com/tpolecat/doobie)? –

回答

1

有关DB访问库的注释很好;那会更好一些。但是根据您的使用情况可能会过度杀伤。下面是如何将直接写:

val taxes = if(rs.next()) { 
    (1 to 4).map { a => 
    for { 
     state <- Option(rs.getString("state"+a)) 
     code <- Option(rs.getString("code"+a)) 
     pr <- Option(rs.getString("pr"+a)) 
     lic <- Option(rs.getString("lic"+a)) 
    } yield Tax(state, code, pr, lic) 
    }.toList.flatten 
} else { 
    List.empty[Tax] 
} 
+0

当其中一个元素(state/code/pr/lic)为null/None时,Tax本身就是空的。在我的场景中,一列大部分是空白的,因为完整的结果集将作为空/空 –

+0

如果您想允许其中一个字段为空,请在案例类中将其更改为“Option [String]”,并且用'val field = Option(...)'替换'field < - Option(...)' 良好的scala风格对于不允许任何位置的空值以及使用Options来说非常坚定。 –