質問

実行する必要がある非常にシンプルな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;
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top