我知道我的 Scala Slick 数据访问层应该是什么样子,但我不确定它是否真的可能。
假设我有一个 User 表,其中包含 id、email、密码等常用字段。
object Users extends Table[(String, String, Option[String], Boolean)]("User") {
def id = column[String]("id", O.PrimaryKey)
def email = column[String]("email")
def password = column[String]("password")
def active = column[Boolean]("active")
def * = id ~ email ~ password.? ~ active
}
而且我希望以不同的方式查询它们,目前丑陋的方式是创建一个新的数据库会话,执行 for 理解,然后执行不同的 if 语句来实现我想要的。
例如
def getUser(email: String, password: String): Option[User] = {
database withSession { implicit session: Session =>
val queryUser = (for {
user <- Users
if user.email === email &&
user.password === password &&
user.active === true
} //yield and map to user class, etc...
}
def getUser(identifier: String): Option[User] = {
database withSession { implicit session: Session =>
val queryUser = (for {
user <- Users
if user.id === identifier &&
user.active === true
} //yield and map to user class, etc...
}
我希望有一个用于查询的私有方法,然后是定义查询的公共方法
type UserQuery = User => Boolean
private def getUserByQuery(whereQuery: UserQuery): Option[User] = {
database withSession { implicit session: Session =>
val queryUser = (for {
user <- Users
somehow run whereQuery here to filter
} // yield and boring stuff
}
def getUserByEmailAndPassword(email, pass){ ... define by query and call getUserByQuery ...}
getUserById(id){….}
getUserByFoo{….}
这样,查询逻辑被封装在相关的公共函数中,而实际查询和映射到用户对象是在一个其他人不需要关心的可重用函数中。
我遇到的问题是试图将“where”位重构为我可以传递的函数。尝试在 intellij 中选择它们并使用重构会导致一些非常疯狂的打字。
有没有人有任何例子可以证明他们正在接近我想要实现的目标?