当前位置: 首页 > 面试题库 >

Play2和Anorm,如何使一对多关系成为“众人皆知”

邓翼
2023-03-14
问题内容

我与User和LinkedAccount之间存在一对多关系,一个User可以有多个链接帐户。

LinkedAccount(id, provider_user_id, salt, provider_id, auth_method, avatar_url, User.findBy(user)) 在解析器中加载LinkedAccount及其用户是没有问题的。

我不知道的是如何用LinkedAccounts加载用户。我想我需要让用户知道LinkedAccounts ..但是如何?

每当我想查找用户是否具有给定类型的链接帐户时,我都希望摆脱对数据库的一个额外的sql调用。目前,我确实喜欢这样:

def findLinkedAccountByUserAndProvider(userId: Pk[Long], providerId : String) = {
    DB.withConnection {
      implicit connection =>
        SQL("select * from linked_account la where la.user_id = {userId} and la.provider_id = {providerId}")
          .on("userId" -> userId, "providerId" -> providerId).as(LinkedAccount.simple.singleOpt)
    }
  }

还是当用户知道它的LinkedAccounts和LinkedAccount知道它的用户时,这会引起问题吗?

用户:

case class User(id: Pk[Long] = NotAssigned,
                firstName: String,
                lastName: String,
                email: String,
                emailValidated: Boolean,
                lastLogin: DateTime,
                created: DateTime,
                modified: DateTime,
                active: Boolean)

object User {
  val simple = {
    get[Pk[Long]]("id") ~
      get[String]("first_name") ~
      get[String]("last_name") ~
      get[String]("email") ~
      get[Boolean]("email_validated") ~
      get[DateTime]("last_login") ~
      get[DateTime]("created") ~
      get[DateTime]("modified") ~
      get[Boolean]("active") map {
      case id ~ first_name ~ last_name ~ email ~ email_validated ~ last_login ~ created ~ modified ~ active =>
        User(id, first_name, last_name, email, email_validated, last_login, created, modified, active)
    }
  }
}

关联帐户:

case class LinkedAccount(id: Pk[Long] = NotAssigned,
                         providerUserId: String,
                         salt: Option[String],
                         providerId: String,
                         authMethod: Option[String],
                         avatarUrl: Option[String],
                         user: User
                         )

object LinkedAccount {
  val simple = {
    get[Pk[Long]]("id") ~
    get[String]("provider_user_id") ~
    get[Option[String]]("salt") ~
    get[String]("provider_id") ~
    get[Option[String]]("auth_method") ~
    get[Option[String]]("avatar_url") ~
    get[Pk[Long]]("user_id") map {
      case id ~ provider_user_id ~ salt ~ provider_id ~ auth_method ~ avatar_url ~ user  =>
        LinkedAccount(id, provider_user_id, salt, provider_id, auth_method, avatar_url, User.findBy(user))
    }
  }
}

问题答案:

由于我没有答案,因此我将提供自己的答案:

在案例类中,我定义:

case class User(id: Pk[Long] = NotAssigned,
                firstName: String,
                lastName: String,
                email: String,
                emailValidated: Boolean,
                lastLogin: DateTime,
                created: DateTime,
                modified: DateTime,
                active: Boolean) {

lazy val linkedAccounts: Seq[LinkedAccount] = DB.withConnection("test") { implicit connection =>
    SQL(
      """
        select * from linked_account la
        join users on la.user_id = users.id
        where la.id = {id}
      """
    ).on(
      'id -> id
    ).as(LinkedAccount.simple *)
  }
}

然后通过以下方式获取帐户:

val linkedAccounts = user.linkedAccounts

在这里找到这个



 类似资料:
  • 这是项目迁移 这是时间表 这样用户就可以迁移了 这是我的项目模型 这是我的时间表模型: 这是我的用户模型 现在,我从项目返回我的查询 这是可以的,但user_id用户在timesheets.user_id我不能得到它的时间表,并得到它 此控制器按时间表中的项目id返回项目和时间表,但时间表中的用户id我不知道如何将其输入系统

  • 问题内容: 任何人都可以解释在设计带有示例的表时如何实现一对一,一对多和多对多关系吗? 问题答案: 一对一: 使用外键访问被引用的表: 您还必须在外键列()上设置唯一约束,以防止子表()中的多行与引用表()中的同一行相关。 一对多 :在关系的许多方面使用外键链接回“一个”侧: 多对多 :使用联结表(例如): 查询示例:

  • 我正在学习冬眠,只是有点困惑。

  • 生成的子实体映射器方法(缺少setChildren或,在我的例子中): 如何让映射器在子级中设置父级?

  • 我正在使用Play Framework 2.1.0和Ebean,在查询下列场景时遇到问题: 我有3类表示数据库中的表。 使用Ebean,如何 > 是否检索项目列表中的所有子项目? 是否检索项目的所有小型项目? 给定子项目列表,如何检索所有小项目?

  • 本文向大家介绍mybatis关系映射之一对多和多对一,包括了mybatis关系映射之一对多和多对一的使用技巧和注意事项,需要的朋友参考一下 本实例使用用户和订单的例子做说明: 一个用户可以有多个订单, 一个订单只对应一个用户。(其中应用到注释) 1.代码的结构 2. 建表语句: 3. 用户实体: 4. 订单实体: 5.写PersonMapper.java的接口 6. 一对多实体配置: Person