2009-10-16 4 views
11

나는 수행 할 필요가있는 매우 간단한 SQL을 가지고있다.JPQL, 무언가를 선택하는 방법

나는 ProcessUser, RoleProcessUserRole 테이블을 가지고 있습니다. 똑 바른 앞으로 다 대다

나는 모두 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에없는 역할 이름이 표시됩니다. 설명 할 수 있니? –

+0

@ 세븐 - 태그에주의해야합니다. "SQL"(이제 JPQL로 변경됨)으로 질문 태그를 지정했기 때문에 아래 답변의 대부분이 올바르지 않습니다. – 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'왜냐하면 이미 안된다고했기 때문이다. –

+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

이는 곧 JPQL이 아닌 SQL입니다. – ChssPly76

0

중첩 쿼리를 실행합니다. 먼저 sysadmin 역할을 가진 모든 사용자를 선택하십시오. 그런 다음이 보완 항목을 선택하거나이 결과에없는 모든 사용자를 선택하십시오.

1

사용자가 두 가지 역할을하므로 기본적으로 사용자/역할 목록을 다시 가져 오며, 'sysadmin'역할을 제외하여 한 행을 필터링합니다. 원하는 역할을하는 사람들이 '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 솔루션을 제공 한 이후로 올바른 방향으로 그를 가리켜 주겠다는 희망이 게시됩니다. 실제로 당신이 다른 사람들의 반응을 지적한 후 50 분이 지날 때까지 아무 것도 게시하지 않았습니다. JPQL – Gratzy

+0

"희망"이 당신의 대답에 언급되었을 것입니다. 내가 너를 무너 뜨리지 않았다는 것을 주목하라. 나는 이것이 OP의 질문에 대한 올바른 해결책이 아니라는 것을 지적하고있다. 멀리 "50 분 후"이동, 나는 당신이 또는이 스레드에서 다른 사람이 실제로 내 대답을 후 JPSQL을 포함하도록 후 응답을 업데이트 할 때까지 기다렸습니다 그래서 upvote 수 및 나는 단지 내 대답을 게시했습니다. 그것은 일어나지 않았다. – 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; 
관련 문제