質問
実行する必要がある非常にシンプルなSQLがあります。
私は持っています ProcessUser
, Role
そしてa ProcessUserRole
テーブル。素直な多目的です
すべてを選択したいです ProcessUser
管理者の役割もあります。
ただし、私のJPQLは私のユーザーにも役員もいるため失敗するため、リストで取得されます。
これがJPQLです:
entityManager.createQuery("SELECT p FROM " + ProcessUser.class.getName()
+ " p join p.roles role WHERE role.name NOT IN ('sysadmin')").getResultList();
生成されたSQLは次のとおりです。
select distinct processuse0_.id as id8_, processuse0_.position as position8_, processuse0_.username as username8_, processuse0_.organization_id as organiza9_8_, processuse0_.passwordHash as password4_8_, processuse0_.fromEmail as fromEmail8_, processuse0_.firstname as firstname8_, processuse0_.lastname as lastname8_, processuse0_.processes as processes8_ from ProcessUser processuse0_ inner join ProcessUserRoles roles1_ on processuse0_.id=roles1_.userId inner join Role role2_ on roles1_.roleId=role2_.id where ( role2_.name not in ( 'sysadmin' ) )
解決
サブクエリを使用した適切なJPQL構文:
SELECT p FROM ProcessUser p
WHERE p.id NOT IN (
SELECT p2.id FROM ProcessUser p2
JOIN p2.roles role
WHERE role.name='sysadmin'
)
他のヒント
これはあなたのために働きますか?
SELECT *
FROM ProcessUser
WHERE Exists
(
SELECT 1
FROM
ProcessUserRoles
INNER JOIN Roles
ON Roles.RoleId = ProcessUserRoles.RoleId
WHERE 1=1
AND ProcessUser.ProcessUserId = ProcessUserRoles.ProcessUserId
AND Roles.RoleDescription = 'Super User'
)
クエリは、ユーザーが2回戻ってくる2つのロールがあるため、ユーザー/ロールのリストを基本的に取り戻します。「sysadmin」の役割を除外して1列を除外します。あなたがやりたいと思うのは、他の役割を持っているにもかかわらず、「sysadmin」の役割を持つすべてのユーザーを除外することです。あなたに何かをあなたに追加する必要がありますクエリのようなものです。 (私はあなたの説明ではなくあなたのクエリで行きます)
where processuse0_.id not in
select ( userId from
ProcessUserRoles
inner join
Role
on ProcessUserRoles.roleId=Role.id
where role.name != 'sysadmin'
)
ネストされたクエリを実行します。まず、Sysadminの役割を持つすべてのユーザーを選択します。次に、これの補完、またはこの結果にないすべてのユーザーを選択します。
JPQL:
TypedQuery<ProcessUser> query = em.createQuery("" +
" SELECT p FROM ProcessUser p " +
" WHERE p.roles.name <> ?1", ProcessUser.class);
query.setParameter(1, "sysadmin");
return query.getResultList;
所属していません StackOverflow