データベースとの対話用のアプリで ActiveAndroid を使用しています。いくつかのテーブルを結合し、結果をフィルター処理する必要があります。これは通常、サブクエリを含む SQL クエリを使用して実行します。
ActiveAndroid を使用してサブクエリを実行するにはどうすればよいですか?
サブクエリを実行できない場合、一意のモデル オブジェクトのみを返す方法はありますか? 私のクエリの結合は、結合テーブルに重複する行を作成する効果がありますが、各モデルのインスタンスを 1 つだけ返す必要があります。
編集:詳細情報の提供
取得しようとしているモデルは Profile と呼ばれます。
クエリに関しては、Profiles、Roles、および ProfileRoleJoins の 3 つのテーブルがあります。
プロファイルとロールの間には多対多の関係があり、その関係は ProfileRoleJoins と呼ばれる結合テーブルによって維持されます。
私の目標は、特定の「event_id」を持ち、役割タイプのリストで指定された 1 つ以上の役割に接続されているすべてのプロファイルを取得することです。
このクエリで興味深いのは、次のフィールドです。
プロフィール
- 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 テーブルに対してメイン クエリでフィルターを実行します。