我在应用程序中使用 ActiveAndroid 进行数据库交互。我需要加入几个表,然后过滤结果,我通常会使用带有子查询的 SQL 查询来完成。
如何使用 ActiveAndroid 完成子查询?
如果无法完成子查询,有没有办法只返回唯一的模型对象?我的查询中的连接具有在连接表中创建重复行的效果,但我只希望返回每个模型的一个实例。
编辑:提供更多信息
我要检索的模型称为 Profile。
关于查询,有 3 个表:Profiles、Roles 和 ProfileRoleJoins
Profiles 和 Roles 之间存在多对多关系,该关系由名为 ProfileRoleJoins 的连接表维护。
我的目标是获取所有具有特定“event_id”并连接到由角色类型列表指定的一个或多个角色的配置文件。
此查询感兴趣的是以下字段:
简介
- ID
- event_id(不是外键,只是一个数据字段)
角色
- ID
- 类型(文本)
简介角色加入
- 配置文件(外键)
- 角色(外键)
我试过的
String eventId = //provided as input to this function
String[] roles = //array of "types" of roles we want to limit to
String whereClause = //built in a loop, looks like "Roles.type = ? OR Roles.type = ?..."
new Select()
.from(ProfileEntity.class)
.where("event_id = ?", eventId)
.join(ProfileRoleJoinsTable.class)
.on("Profiles.Id = ProfileRoleJoins.profile")
.join(RoleEntity.class)
.on("ProfileRoleJoins.role = Roles.Id")
.where(whereClause, roles)
.execute();
上述查询存在返回重复配置文件的问题,因为单个配置文件可以与多个角色相关联,这会在连接过程中创建重复项。
我需要检索唯一配置文件列表。
我尝试使用Distinct()
,但该限定符适用于每组列 - 我需要返回整个配置文件。
我通常实现唯一性的方法是在子查询中执行上述查询并仅返回 DISTINCT Profiles.Id 值。然后我会在主查询中针对原始 Profiles 表运行过滤器。