假设我有一个包含许多小列的表和一个大的(比如BLOB)列:
case class Thing(id: Int, small1: String, small2: String, small3: String, large: String)
class ThingMapping(tag: Tag) extends Table[Thing](tag, "things") {
def id = column[Int]("id", O.PrimaryKey, O.NotNull, O.AutoInc)
def small1 = column[String]("small1")
def small2 = column[String]("small2")
def small3 = column[String]("small3")
def large = column[String]("large")
def * = (id, small1, small2, small3, large) <> (Thing.tupled, Thing.unapply)
}
在某些情况下,我想查询表格中除large
列以外的所有列。在其他人,我想包括它。我更喜欢使用case类而不是元组。
Slick中是否有良好的模式可以做到这一点?
我考虑的选项:
答案 0 :(得分:-1)
我认为您需要的是map
上的TableQuery
功能,以便您只选择字段的子集。所以像这样:
case class Thing(id: Int, small1: String, small2: String, small3: String, large: String)
case class LiteThing(id: Int, small1: String, small2: String, small3: String)
class ThingMapping(tag: Tag) extends Table[Thing](tag, "things") {
def id = column[Int]("id", O.PrimaryKey, O.NotNull, O.AutoInc)
def small1 = column[String]("small1")
def small2 = column[String]("small2")
def small3 = column[String]("small3")
def large = column[String]("large")
def * = (id, small1, small2, small3, large) <> (Thing.tupled, Thing.unapply)
}
val things = TableQuery[ThingMapping]
val liteThingQuery = things.map(t => LiteThing(t.id, t.small1, t.small2, t.small3))
所以我添加了另一个名为LiteThing
的案例类,它表示字段的子集,不包括large
列。然后,我使用map
创建一个新查询,该查询不会选择large
字段,而是映射到LiteThing
。我没有编译这个,但我很确定这是你想要进入的方向。我从Hello Slick Activator Template,“选择特定列”部分(完全扩展教程信息之后)得到了这个。
您可以使用
等替代方案def small = (id, small1, small2, small3)
def * = (small, large)
或
def small = (id, small1, small2, small3)
def * = small ~ large <> (Thing.tupled, Thing.unapply)
并使用
things.map(_.small)