如何在Android Room中使用@Relation进行多对一查询

问题描述 投票:0回答:1

如果一个用户只能属于一个组,则 user:group 是多对一关系。

@Entity(tableName="user")
data class UserEntity(
  @PrimaryKey(autoGenerate = true)
  val uid: Int,
  val username: String,
  val groupId: Int
  ...
)

@Entity(tableName="group")
data class GroupEntity(
  @PrimaryKey(autoGenerate = true)
  val gid: Int,
  val name: String,
)

我可以使用 POJO 和左连接进行查询,如下所示:

data class UserWithGroup(
  @Embedded
  val user: UserEntity,
  @Embedded
  val group: GroupEntity,
)

@Dao
interface UserDao {

    @Transaction
    @Query("SELECT * FROM `user` u LEFT JOIN `group` g ON u.group_id = g.id")
    fun getAllUserWithGroup(): List<UserWithGroup>

}

是否可以在 UserWithGroup 中使用 @Relation 来获取具有组的用户?似乎互联网上的大多数示例都是获取包含用户列表的组,如何获取具有 @Relation 关联组的用户,如下面的代码?

data class UserWithGroup(
  @Embedded
  val user: UserEntity,
  @Relation(
     parentColumn = "gid",
     entityColumn = "groupId",
  )
  val group: GroupEntity
)

@Dao
interface UserDao {

    @Transaction
    @Query("SELECT * FROM `user`")
    fun getAllUserWithGroup(): List<UserWithGroup>

}
android android-room many-to-one
1个回答
0
投票

我认为您的问题是您正在编码,就好像组是用户的父级一样,而不是使用用户作为组的父级进行编码。所以:-

data class UserWithGroup(
    @Embedded
    val user: UserEntity,
    @Relation(
        entity = GroupEntity::class,
        parentColumn = "groupId",
        entityColumn = "gid",
    )
    val group: GroupEntity
)
  • 请注意,在这种情况下,
    entity=GroupEntity::class
    是可选的,但建议这样做,因为如果
    @Relation
    的输出类型不是表(因为如果层次结构大于2个级别,它可以/将会是) .
© www.soinside.com 2019 - 2024. All rights reserved.