【发布时间】:2015-01-24 04:01:55
【问题描述】:
在 Slick 2.1 中,我需要执行一个 query/map 操作,如果它包含某个非空值,我将一个可空字段转换为无。不确定它是否重要,但在我的情况下,有问题的列类型是映射列类型。这是一个代码 sn-p 试图说明我正在尝试做的事情。它不会编译,因为编译器不喜欢None。
case class Record(field1: Int, field2: Int, field3: MyEnum)
sealed trait MyEnum
val MyValue: MyEnum = new MyEnum { }
// table is a TableQuery[Record]
table.map { r => (
r.field1,
r.field2,
Case If (r.field3 === MyValue) Then MyValue Else None // compile error on 'None'
)
}
错误是这样的:
type mismatch; found : None.type required: scala.slick.lifted.Column[MyEnum]
实际上,我想这样做的原因是我想执行groupBy,其中我计算field3 包含给定值的记录数。我无法让更复杂的groupBy 表达式工作,所以我退回到这个我仍然无法工作的更简单的例子。如果有更直接的方式向我展示groupBy 表达式,那也很好。谢谢!
更新
我尝试了@cvogt 建议的代码,但这会产生编译错误。这是SSCCE,以防任何人在这里发现我做错了什么。编译失败,“value ? is not a member of Int”:
import scala.slick.jdbc.JdbcBackend.Database
import scala.slick.driver.H2Driver
object ExpMain extends App {
val dbName = "mydb"
val db = Database.forURL(s"jdbc:h2:mem:${dbName};DB_CLOSE_DELAY=-1", driver = "org.h2.Driver")
val driver = H2Driver
import driver.simple._
class Exp(tag: Tag) extends Table[(Int, Option[Int])](tag, "EXP") {
def id = column[Int]("ID", O.PrimaryKey)
def value = column[Option[Int]]("VALUE")
def * = (id, value)
}
val exp = TableQuery[Exp]
db withSession { implicit session =>
exp.ddl.create
exp += (1, (Some(1)))
exp += (2, None)
exp += (3, (Some(4)))
exp.map { record =>
Case If (record.value === 1) Then 1.? Else None // this will NOT compile
//Case If (record.value === 1) Then Some(1) Else None // this will NOT compile
//Case If (record.value === 1) Then 1 Else 0 // this will compile
}.foreach {
println
}
}
}
【问题讨论】:
标签: scala group-by option slick