2009-10-16 9 views
11

私は実行する必要がある非常に単純なSQLを持っています。JPQL、何かを選択しないでください

私は、ProcessUser,RoleおよびProcessUserRoleテーブルを持っています。まっすぐ進む多対多

私はすべてProcessUserも選択したいと思いますが、役割はadminです。

しかし、私のユーザーにも役割担当者がいるため、自分の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' 
      ) 
     ) 
+0

あなたはADMINの役割を含めたいと言いますあなたのサンプルにはSysAdminではなくROLE NAMEが表示されます。説明できますか? –

+0

@Shervin - あなたはあなたのタグに注意する必要があります。あなたの質問に「SQL」とタグ付けされているため、以下の回答の大部分が間違っています。 – ChssPly76

+0

いいえいいえadmin(sysadmin)を含めたくありません。 ProcessUserはユーザとシステム管理者です。したがって、私の選択は私に必要なものを私に与えません。私は、sysadminの役割を持っている場合は、ユーザーに任せて欲しい。 –

答えて

17

適切な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' 
) 
+0

ありがとう、これはほとんどうまくいきましたが、正しいのはどこですか?role.name == 'sysadmin'あなたはすでにNOT INと言っているので –

+0

私はそういう意味でしたrole.name = 'sysadmin' –

1

ウィルあなたのためにこの作品ここ

はJPQLのですか?

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' 
) 
+0

これは、SQLであり、JPQLではありません。 – ChssPly76

0

ネストされたクエリを実行します。まず、sysadminの役割を持つすべてのユーザーを選択します。次に、これの補数、またはこの結果にないすべてのユーザーを選択します。

1

あなたのユーザーは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' 

      ) 
+1

ここでも、これはJPQLではなくSQLです。 – ChssPly76

+0

@ ChssPly76うまくいけば、SQLは、誰もJPQLソリューションを提供していなかったので、彼が正しい方向に彼のJPQLを修正するために彼を指し示すことを願っています。実際には、他の人の回答がJPQL – Gratzy

+0

ではないことを指摘してから50分後に投稿していませんでした。あなたの答えで「希望」が言及されているはずです。私はあなたにdownvoteしなかったことに注意してください。私はこれが実際にOPの質問に対する有効な解決策ではないことを指摘しています。 「50分後」までは、私は自分のコメントの後にJPSQLを含むようにして、あなたや他の誰かが実際に答えを更新するのを待っていたので、アップアップすることができました。それは起こらなかった。 – ChssPly76

0

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; 
関連する問題