سؤال

لدي SQL بسيطة جدا أحتاج إلى أداء.

انا املك ProcessUser, Role و 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'
)

يعيد استعلامك بشكل أساسي قائمة من المستخدمين/الأدوار نظرًا لأن المستخدم لديه دوران يعود مرتين ، حيث تقوم بتصفية صف واحد عن طريق استبعاد دور "Sysadmin". ما يبدو أنك تريد القيام به هو استبعاد جميع المستخدمين الذين لديهم دور "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