1

USERS および GROUPS テーブルを持つ既存のシステムがあります。ユーザーとグループの JPA オブジェクトがあります。

テーブル USERGROUPS は、どのユーザーがどのグループに属しているかのマッピングです。このテーブルはオブジェクトにマップされていません。私はほとんどの場合、次のように単純な SQL クエリを実行します。

public List<User> getUsersByGroupId(long groupId) {
  List<User> users = new ArrayList<User>();
  String query = "select USERGROUPS.USER_ID from USERGROUPS where USERGROUPS.GROUP_ID = ?1";
  Query q = getEntityManager().createNativeQuery(query, Long.class);
  q.setParameter(1, groupId);
  List<Long> userIds = new ArrayList<Long>();
  usersIds.addAll(q.getResultList());
  for (Long id : userIds) {
    users.add(getUser(id));
  } 
  return users;
}

すべて正常に動作します。

これで、USERS テーブルのユーザーのサブセットを使用する新しいアプリケーションができました。

計画は、MYAPP_USERS という新しいテーブルを追加することです (既存のテーブルを変更したくないため)。このテーブルは、MYAPP にリストするユーザーの USER_ID という 1 つの列で構成されます。

私の質問は、MYAPP_USERS テーブルにあるグループのメンバーのみを返すようにクエリを変更する方法です。

つまり、どうすればいいですか:

  String query = "select USERGROUPS.USER_ID from USERGROUPS where USERGROUPS.GROUP_ID = ?1 and WHERE ?1 IS IN MYAPP_USERS";

?

どんな助けでも大歓迎です!

4

2 に答える 2

0

次のようなことができます:

select USERGROUPS.USER_ID 
from   USERGROUPS 
where  USERGROUPS.GROUP_ID = ?1 
   AND EXISTS (SELECT * FROM MYAPP_USERS WHERE USER_ID = ?1)
于 2012-11-08T21:03:06.460 に答える
0

MYAPP_USERS テーブルで見つかったユーザーの結果のみを取得するには、そのテーブルから開始し、USERGROUPS で INNER JOIN を実行して、GROUP_ID を取得します。

SELECT usergroups.user_ID
FROM myapp_users INNER JOIN usergroups
ON myapp_users.user_ID = usergroups.user_ID
WHERE usergroups.group_ID = ?1

将来の計画を立てるために、myapp テーブルの代わりに、列 user_ID と app_ID を持つテーブル app_users を作成し、クエリで app_ID を指定します。

...
WHERE usergroups.group_ID = ?1
AND app_ID = ?2
于 2012-11-08T22:21:58.450 に答える