You need to enable JavaScript to run this app. Room使用@Relation关联双外键 查询Car关联的Owner与Brand实体
优惠活动
大模型
产品
解决方案
定价
更多

Room使用@Relation关联双外键 查询Car关联的Owner与Brand实体

可以通过@Relation注解实现该需求,你之前的实现存在三处核心错误:

  • 嵌入的主实体错误:你需要以Car作为核心查询主体,应该嵌入Car实体而非Person实体
  • @Relation标注的字段类型错误:字段类型需要对应你要关联的目标实体(Brand、Person),你之前都设置为Car类型,自然会返回无意义的Car对象
  • 关联字段映射逻辑错误:parentColumn 是嵌入的主实体(Car)中存储的外键字段,entityColumn 是目标关联实体的主键字段,你之前的映射关系完全写反了

正确实现方式如下:

1. 编写关联查询结果类

public class CarWithOwnerAndBrand {
    // 嵌入主实体Car,作为关联查询的核心
    @Embedded
    Car car;

    // 关联Brand实体:Car的外键brandId对应Brand的主键id
    @Relation(parentColumn = "brandId", entityColumn = "id", entity = Brand.class)
    Brand brand;

    // 关联Person(车主)实体:Car的外键personId对应Person的主键id
    @Relation(parentColumn = "personId", entityColumn = "id", entity = Person.class)
    Person owner;
}

2. 编写Dao层查询方法

需要添加@Transaction注解保证关联查询的原子性,避免数据不一致:

@Dao
public interface CarDao {
    @Transaction
    @Query("SELECT * FROM Car")
    List<CarWithOwnerAndBrand> getAllCarsWithFullRelations();
}

调用该方法查询时,Room会自动根据@Relation的配置关联查询Brand和Person表,返回包含完整关联实体的结果。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.17 02:06:01