【问题标题】:Filtering in Slick with foreign key field使用外键字段在 Slick 中过滤
【发布时间】:2014-03-26 08:38:23
【问题描述】:

是否可以在 Slick wherefilter 语句中使用外键字段?

类似(user 字段是表的外键,User 是其映射投影)(这不会编译):

def findByUser(user: User)(implicit s: Session): Option[Token] =
    tokens.where(_.user === user).firstOption

或者我们应该明确地使用外键?

def findByUser(user: User)(implicit s: Session): Option[Token] =
    tokens.where(_.userId === user.id).firstOption

【问题讨论】:

    标签: scala slick slick-2.0


    【解决方案1】:

    是的,身份证很好。

    def findByUserId(userId: Long)(implicit s: Session): Option[Token] =
        tokens.filter(_.userId === userId).firstOption
    
    findByUserId( user.id )
    

    这允许使用该方法,即使您只有一个 id。 Slick 故意暴露了关系模型(具有功能性)并且没有隐藏它,除其他原因外,因为使用 id 而不是对象引用允许仅通过其 id 来引用未加载到内存中的行。

    甚至更好、更简单,因为内置在 Slick 中:

    val findByUserId = tokens.findBy(_.userId) // pre-compiles SQL for better performance
    findByUserId(user.id).firstOption
    

    【讨论】:

    • 你的第二个选择比第一个更快吗?
    • 它会预编译查询,因此如果您将 val 存储在可重复使用的位置,您可以节省一些开销,是的。
    • 它显然是线程安全的,对吧?它在 FP 语音中是不确定的 :)
    猜你喜欢
    • 1970-01-01
    • 2014-08-24
    • 2012-04-28
    • 1970-01-01
    • 2018-12-13
    • 1970-01-01
    • 1970-01-01
    • 2023-03-16
    • 2021-12-09
    相关资源
    最近更新 更多