如何将查询结果转换为不包含所有参数的case类?

时间:2015-03-20 14:55:21

标签: scala slick

我有以下案例类:

case class User (id: Option[Long] = None, name: String = "", lastName: String = "", login: String = "", password: String = "")

和下表介绍:

class Users(tag: Tag) extends Table[User](tag,"t_users"){

  def id = column[Option[Long]]("id", O.PrimaryKey, O.AutoInc)
  def name = column[String]("name")
  def lastName = column[String]("lastName")
  def login = column[String]("login", O.NotNull)
  def password = column[String]("password")

  def * = (id, name, lastName, login, password) <> ((User.apply _).tupled, User.unapply _)
}

我想执行查询,该查询会列出一些&#34;用户&#34;但没有密码。

我可以这样做:

def list(page: Int = 0, pageSize: Int = 10, filter: String = "%")(implicit s: Session): Page[User] = {
    val offset = pageSize * (page -1)
    val query = (for {
        u <- users 
        if u.name.toLowerCase like filter.toLowerCase()
    } yield u) 

    query.drop(offset).take(pageSize)

    val totalRows = count(s)
    val result = query.list

    Page(result,page,offset,totalRows)

}

这会让我的用户满满的,但我想表现出这样的收益:

yield User(u.id,u.name,u.lastName,u.login) // bound to a User

有可能吗?

修改

我可以通过以下方式接受收益:

yield User(u.id.asInstanceOf[Option[Long]],u.name.asInstanceOf[String],u.lastName.asInstanceOf[String],u.login.asInstanceOf[String],""))

但现在它给我一个错误

u <- users 

话说:

  • 找不到匹配的形状。 Slick不知道如何映射给定的类型。可能的原因:表[T]中的T与您的*投影不匹配。或者您在查询中使用不受支持的类型(例如scala列表)。所需级别:scala#23.slick#2774.lifted#19028.FlatShapeLevel#24408来源类型:型号#29.User#17383未包装类型:T#10265565包装类型:G#10265564

  • 方法地图#59065没有足够的参数:(隐式形状#10265576:scala#23.slick#2774.lifted#19028.Shape#24129 [_&lt;:scala#23.slick#2774.lifted #19028.FlatShapeLevel#24408,型号#29.User#17383,T#10265565,G#10265564])scala#23.slick#2774.lifted#19028.Query#23982 [G#10265564,T#10265565,Seq# 3031。未指定的值参数形状。

1 个答案:

答案 0 :(得分:0)

我不确定这一点,但您可以尝试:

val query = (for {
    u <- users 
    if u.name.toLowerCase like filter.toLowerCase()
} yield u.copy(password = ""))