光滑 - 可选择包括/省略大列

时间:2014-08-27 10:59:17

标签: scala slick slick-2.0

假设我有一个包含许多小列的表和一个大的(比如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中是否有良好的模式可以做到这一点?

我考虑的选项:

  1. 有两个映射 - “瘦”和“胖”映射。
  2. 将大列拆分为单独的表,然后根据需要将其加入。

1 个答案:

答案 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)