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

Room数据库一对多关联查询异常:每个父项仅返回一个子项

问题描述

我有Inspection和Items两个类,二者为一对多关系(一个Inspection对应多个Items,每个Item仅关联一个Inspection),并在Room本地数据库中对应两张表:

Inspection表实体类

@Entity(tableName = "vehicle_inspection")
public class VehicleInspectionDB {

    @PrimaryKey(autoGenerate = true)
    private long inspectionDBId;
    // 其他字段...
}

Item表实体类

@Entity(tableName = "inspection_item")
public class VehicleInspectionItemDB {

    @PrimaryKey(autoGenerate = true)
    private long itemDBId;
    private long inspectionDBId;
    // 其他字段...
}

为了查询Inspection及其关联的Items,我创建了如下类:

关联查询实体类

public class InspectionAndItemsDB {
    @Embedded
    public VehicleInspectionDB inspection;
    @Relation(
        parentColumn = "inspectionDBId",
        entityColumn = "itemDBId"
    )
    public List<VehicleInspectionItemDB> items;
}

以及对应的DAO方法:

DAO查询方法

@Transaction
@Query("SELECT * FROM vehicle_inspection")
Flowable<List<InspectionAndItemsDB>> getInspectionAndItems();

问题现象

调用上述方法查询时,每个Inspection对应的items列表仅包含一个子项,而非所有关联的Items。我参考了谷歌开发者的教程仍未解决,请问问题出在哪里?


问题原因与解决方法

问题出在@Relation注解的entityColumn参数配置错误:

  • parentColumn指定父实体(VehicleInspectionDB)的关联主键字段,这里的inspectionDBId是正确的。
  • entityColumn需要指定子实体(VehicleInspectionItemDB)中关联父实体的外键字段,而非子实体自身的主键itemDBId。你的子实体中用来关联父实体的字段是inspectionDBId,所以此处配置错误。

修正后的关联查询实体类代码:

public class InspectionAndItemsDB {
    @Embedded
    public VehicleInspectionDB inspection;
    @Relation(
        parentColumn = "inspectionDBId",
        entityColumn = "inspectionDBId"
    )
    public List<VehicleInspectionItemDB> items;
}

修正后Room就能通过父实体的inspectionDBId匹配子实体中对应的外键字段,正确查询到所有关联的Items。

内容的提问来源于stack exchange,提问作者Olegario López

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 02:26:01