You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何创建带多列表(一对多+多对多)的Android Room DAO

解决Room同时获取Job关联的Workers和Posters的问题

要实现同时返回包含Workers和Posters列表的Job对象,只需创建一个整合型数据类,通过多个@Relation注解分别关联Workers和Posters实体即可,具体步骤如下:

1. 创建整合数据类JobWithWorkersAndPosters

基于现有实体,嵌入Job并添加两个@Relation字段,分别对应Workers和Posters列表:

data class JobWithWorkersAndPosters(
    @Embedded val job: Job,
    // 通过交叉表关联Workers
    @Relation(
        parentColumn = "job_id",
        entityColumn = "worker_id",
        associateBy = Junction(JobWorkerCrossRef::class)
    )
    val workers: List<Worker>,
    // 直接通过job_id关联Posters
    @Relation(
        parentColumn = "job_id",
        entityColumn = "job_id"
    )
    val posters: List<Poster>
)

2. 在DAO中添加对应查询方法

在JobDao接口里新增带@Transaction注解的查询方法,获取整合后的Job数据:

interface JobDao {
    // ... 原有方法保持不变 ...

    @Transaction
    @Query("SELECT * FROM job WHERE job_id = :jobId")
    suspend fun getJobWithWorkersAndPosters(jobId: Int): JobWithWorkersAndPosters?

    // 如需获取所有Job的整合数据,可添加:
    @Transaction
    @Query("SELECT * FROM job")
    suspend fun getAllJobsWithWorkersAndPosters(): List<JobWithWorkersAndPosters>
}

关键说明

  • @Embedded将Job实体的字段直接映射到该数据类中
  • 两个@Relation分别处理不同关联逻辑:Workers通过交叉表JobWorkerCrossRef实现多对多关联,Posters通过job_id实现一对多关联
  • 必须添加@Transaction注解,确保Room在单次事务中完成主表与关联表的查询,保证数据一致性

内容的提问来源于stack exchange,提问作者user1743524

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 03:12:57