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

如何在Room多对多关系库中查询关联指定Tag ID的NameWithTags?

实现Room多对多关系下的指定标签过滤查询

要返回包含指定Tag ID的LiveData<List<NameWithTags>>,核心是先筛选出关联了目标标签的Name记录,再通过Room的@Relation自动关联对应的标签列表,具体实现如下:

DAO层查询方法

在你的DAO接口中添加以下方法:

@Query("SELECT * FROM names_table WHERE nameId IN (SELECT nameId FROM tagInName_table WHERE tagId = :targetTagId)")
@Transaction
fun getNamesWithSpecificTag(targetTagId: Long): LiveData<List<NameWithTags>>

逻辑说明

  1. 子查询SELECT nameId FROM tagInName_table WHERE tagId = :targetTagId会先从关联表中找出所有关联了目标Tag ID的nameId;
  2. 外层查询通过IN关键字筛选出这些nameId对应的Name记录;
  3. 加上@Transaction保证查询的原子性,同时@Relation会自动为每个筛选出的Name关联其对应的所有标签(包括目标标签在内的全部关联标签)。

扩展:多标签匹配(可选)

如果需要筛选同时包含多个指定Tag ID的Name,可以调整SQL语句为:

@Query("SELECT * FROM names_table WHERE nameId IN (SELECT nameId FROM tagInName_table WHERE tagId IN (:targetTagIds) GROUP BY nameId HAVING COUNT(DISTINCT tagId) = :tagCount)")
@Transaction
fun getNamesWithMultipleTags(targetTagIds: List<Long>, tagCount: Int): LiveData<List<NameWithTags>>

这里通过GROUP BY nameId和HAVING COUNT(DISTINCT tagId) = :tagCount确保Name关联了所有传入的标签。

内容的提问来源于stack exchange,提问作者Faris Rizvanović

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 16:16:02