2009-10-16 14 views
11

का चयन कैसे करें मेरे पास एक बहुत ही सरल एसक्यूएल है जो मुझे करने की ज़रूरत है।जेपीक्यूएल, कुछ

मेरे पास ProcessUser, Role और ProcessUserRole तालिका है। एक सीधी आगे कई

मैं सभी ProcessUser का चयन करना चाहता हूं जिसमें व्यवस्थापक की भूमिका भी है।

हालांकि मेरा जेपीक्यूएल विफल रहता है क्योंकि मेरे उपयोगकर्ता के पास रोल ऑफिसर भी है, इसलिए इसे सूची में पुनर्प्राप्त किया जाता है।

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

उत्पन्न एसक्यूएल है:

 
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

आप कहते हैं कि आप व्यवस्थापक की भूमिका शामिल करना चाहते हैं , लेकिन आपका नमूना SysAdmin में नहीं है ROLE NAME दिखाता है। क्या तुम समझा सकते हो? –

+0

@ शेरविन - आपको अपने टैग से सावधान रहना होगा; नीचे दिए गए अधिकांश उत्तर गलत हैं क्योंकि आपने अपना प्रश्न "एसक्यूएल" (अब जेपीक्यूएल में बदल दिया है) – ChssPly76

+0

नहीं किया है, नहीं, मैं व्यवस्थापक (sysadmin) शामिल नहीं करना चाहता हूं। ProcessUser एक उपयोगकर्ता है, और एक sysadmin, इस प्रकार मेरा चयन मुझे वह नहीं मिलता है जो मैं चाहता हूं। मैं चाहता हूं कि उपयोगकर्ता को 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

धन्यवाद, यह लगभग काम करता है, हालांकि सही है WHERE role.name == 'sysadmin' क्योंकि आप पहले से ही –

+0

में नहीं कह रहे हैं, इसलिए मेरा मतलब है कि भूमिका.नाम = '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

यह सीधे एसक्यूएल है, जेपीक्यूएल नहीं। – 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

फिर, यह एसक्यूएल है, जेपीक्यूएल नहीं। – ChssPly76

+0

@ ChssPly76 अच्छी तरह से उम्मीद है कि एसक्यूएल पोस्ट करने से उसे अपने जेपीक्यूएल को ठीक करने के लिए सही दिशा में इंगित किया जाएगा, खासकर जब कोई भी जेपीक्यूएल समाधान नहीं दे रहा था। वास्तव में आपने अन्य लोगों के जवाबों को इंगित करने के 50 मिनट तक एक पोस्ट नहीं किया था, जेपीक्यूएल – Gratzy

+0

नहीं कहा गया था कि "आशा" शायद आपके उत्तर में उल्लेख किया जाना चाहिए। ध्यान दें कि मैंने आपको कम नहीं किया है; मैं बस यह इंगित कर रहा हूं कि यह वास्तव में ओपी के प्रश्न का एक वैध समाधान नहीं है। जहां तक ​​"50 मिनट बाद" जाना है, मैंने यह देखने के लिए इंतजार किया है कि क्या आप या इस धागे में कोई और वास्तव में मेरी टिप्पणियों के बाद जेपीएसक्यूएल रखने के बाद अपने उत्तरों को अपडेट करेगा, इसलिए मैं उन्हें ऊपर उठा सकता हूं और मैंने केवल अपना जवाब पोस्ट कर लिया है ऐसा नहीं हुआ। – 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; 
संबंधित मुद्दे