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
相关产品推荐
相关产品推荐

