2009-10-16 27 views
11

Tôi có một câu lệnh SQL khá đơn giản mà tôi cần phải thực hiện.JPQL, Cách KHÔNG chọn một cái gì đó

Tôi có một số ProcessUser, Role và một bảng ProcessUserRole. Một số nhiều người chuyển tiếp thẳng đứng

Tôi muốn chọn tất cả ProcessUser cũng có vai trò là quản trị viên.

Tuy nhiên, JPQL của tôi không thành công vì người dùng của tôi cũng có nhân viên vai trò, vì vậy nó được truy lục trong danh sách.

Đây là JPQL:

entityManager.createQuery("SELECT p FROM " + ProcessUser.class.getName() 
    + " p join p.roles role WHERE role.name NOT IN ('sysadmin')").getResultList(); 

SQL được tạo ra là:

 
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

Bạn nói rằng bạn muốn bao gồm một Vai trò của ADMIN , nhưng mẫu của bạn hiển thị ROLE NAME NOT IN SysAdmin. Bạn có thể giải thích? –

+0

@Shervin - bạn cần phải cẩn thận với các thẻ của mình; phần lớn các câu trả lời bên dưới là không chính xác vì bạn đã gắn thẻ câu hỏi của mình là "SQL" (giờ đã thay đổi thành JPQL) – ChssPly76

+0

Không, tôi không muốn bao gồm quản trị viên (sysadmin). ProcessUser là một người dùng, và một sysadmin, do đó lựa chọn của tôi không nhận được những gì tôi muốn. Tôi muốn người dùng được ommited nếu có vai trò sysadmin. –

Trả lời

17

đúng cú pháp JPQL sử dụng subquery:

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

Cảm ơn, điều này gần như làm việc, tuy nhiên chính xác là WHERE role.name == 'sysadmin' bởi vì bạn đã nói KHÔNG IN –

+0

Tôi có nghĩa là để nói role.name = 'sysadmin' –

1

tác phẩm này với bạn Will?

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

Đây là SQL thẳng, không phải là JPQL. – ChssPly76

0

Chạy truy vấn lồng nhau. Đầu tiên chọn tất cả người dùng với vai trò của sysadmin. Sau đó chọn phần bổ sung này hoặc tất cả người dùng không có trong kết quả này.

1

Truy vấn của bạn về cơ bản sẽ đưa trở lại danh sách người dùng/vai trò vì người dùng của bạn có hai vai trò mà anh ấy quay lại hai lần, bạn lọc ra một hàng bằng cách loại trừ vai trò của 'sysadmin'. Những gì nó âm thanh như bạn muốn làm là loại trừ tất cả những người dùng có một vai trò của 'sysadmin' bất kể họ có vai trò khác. Bạn sẽ cần phải thêm một cái gì đó để bạn truy vấn như thế nào. (Tôi sẽ bởi truy vấn của bạn không mô tả của bạn)

where processuse0_.id not in 
    select (userId from 
      ProcessUserRoles 
      inner join 
      Role 
      on ProcessUserRoles.roleId=Role.id 
      where role.name != 'sysadmin' 

      ) 
+1

Một lần nữa, đây là SQL, không phải là JPQL. – ChssPly76

+0

@ ChssPly76 cũng hy vọng là đăng bài sql sẽ chỉ cho anh ta theo đúng hướng để sửa chữa JPQL của mình đặc biệt là vì không ai cung cấp giải pháp JPQL. Trong thực tế, bạn đã không đăng một cho đến khi 50 phút sau khi bạn chỉ ra phản ứng của người khác không phải là JPQL – Gratzy

+0

Nói "hy vọng" có lẽ đã được đề cập trong câu trả lời của bạn sau đó. Lưu ý rằng tôi đã không downvote bạn; Tôi chỉ chỉ ra rằng đây không thực sự là một giải pháp hợp lệ cho câu hỏi của OP. Theo như "50 phút sau", tôi đã chờ xem bạn hoặc bất kỳ ai khác trong chủ đề này có thực sự cập nhật câu trả lời của họ sau khi chứa JPSQL sau nhận xét của tôi để tôi có thể upvote họ không và tôi chỉ đăng câu trả lời của mình sau điều đó đã không xảy ra. – 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; 
Các vấn đề liên quan