我在应用中使用ActiveAndroid进行数据库交互。我需要加入几个表然后过滤结果,我通常会使用带有子查询的SQL查询来完成。
如何使用ActiveAndroid完成子查询?
如果无法完成子查询,是否有办法只返回唯一的Model对象?我的查询中的连接具有在连接表中创建重复行的效果,但我只想要返回每个模型的一个实例。
编辑:提供更多信息
我尝试检索的模型称为Profile。
关于查询,有3个表: 个人资料,角色和ProfileRoleJoins
配置文件和角色之间存在多对多关系,该关系由名为ProfileRoleJoins的连接表维护。
我的目标是获取所有具有特定" event_id"的个人资料。并连接到由角色类型列表指定的一个或多个角色。
此查询感兴趣的是以下字段:
配置文件
角色
ProfileRoleJoins
我尝试过的事情
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值。然后我会在主查询中针对原始的个人档案表运行一个过滤器。
答案 0 :(得分:1)
我仍然不知道如何使用ActiveAndroid进行子查询(如果它甚至可能),但我发现了问题的根源。我使用的是过时的库版本,查询系统中出现了一些错误,导致结果搞砸了。使用库的当前版本,我不会重复。