0

我在应用程序中使用 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 表运行过滤器。

4

1 回答 1

1

我仍然不知道如何使用 ActiveAndroid 进行子查询(如果可能的话),但我发现了问题的根源。我使用的是一个过时版本的库,查询系统中出现了某种错误,导致结果出错。使用当前版本的库,我没有重复。

于 2014-07-09T06:28:03.033 回答