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

Android Room双表查询返回重复数据及编译报错问题求助

问题原因说明

  1. 方案2编译报错原因
    你定义的TaskWithProject关联逻辑写反了:当前你将Project作为@Embedded主体,@Relation配置的是「根据Project的id关联对应Task」,这个结构对应「查询Project+该项目下所有Task」的需求。但你方案2的查询语句是查Task表,Room无法将Task表的查询结果映射到以Project为主体的POJO上,因此抛出Cursor转换失败的错误。
  2. 方案1数据重复原因
    你同时使用了手动JOIN语句和@Relation注解:Room解析你手动JOIN返回的结果后,还会按照@Relation的配置额外执行一次关联查询,两次查询叠加导致了数据重复。

解决方案

方案A:使用Room自动关联(推荐)

修正TaskWithProject的结构,以Task为主体关联对应的Project:

public class TaskWithProject {
    @Embedded public Task task;
    @Relation(parentColumn = "projectId", entityColumn = "id")
    public Project project;
}

Dao层直接保留方案2的写法即可,无需手动写JOIN:

@Transaction
@Query("SELECT * FROM Task")
LiveData<List<TaskWithProject>> getTaskWithProject();

方案B:使用手动JOIN映射

如果不想使用@Relation自动关联,就去掉POJO中的@Relation注解,为避免字段重名添加前缀:

public class TaskWithProject {
    @Embedded public Task task;
    @Embedded(prefix = "project_")
    public Project project;
}

Dao层的查询语句给Project字段加对应前缀别名:

@Query("SELECT t.*, p.id AS project_id, p.name AS project_name, p.color AS project_color FROM Task t JOIN Project p ON t.projectId = p.id")
LiveData<List<TaskWithProject>> getTaskWithProject();

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 01:06:03