簡體   English   中英

如何使用子查詢編寫此JPQL查詢?

[英]How do I write this JPQL query with subquery?

我正在嘗試翻譯該SQL語句

SELECT 
  operationalobjective.idoperationalobjective, 
  pno_oo.name
FROM 
  public.operationalobjective, 
  public.policynamedobject pno_oo
WHERE
  pno_oo.idpolicynamedobject = operationalobjective.idoperationalobjective AND
  operationalobjective.idoperationalobjective NOT IN
(
SELECT 
  operationalobjective.idoperationalobjective  
FROM 
  public.operationalobjective, 
  public.goal, 
  public.policy, 
  public.policynamedobject pno_oo, 
  public.policynamedobject pno_p
WHERE 
  goal.idpolicy = policy.idpolicy AND
  goal.idoperationalobjective = operationalobjective.idoperationalobjective AND
  pno_oo.idpolicynamedobject = operationalobjective.idoperationalobjective AND
  pno_p.idpolicynamedobject = policy.idpolicy AND
  policy.idpolicy = <number>
);

考慮到Policy和OperationalObjective都擴展了PolicyNamedObject,我試圖將其引入JPQL:

SELECT oo FROM OperationalObjective oo 
WHERE oo.idoperationalobjective NOT IN 
(
   SELECT oo.idoperationalobjective 
   FROM OperationalObjective oo, Goal g, Policy p 
   WHERE g.policy = :policy AND g.operationalobjective = oo AND p = :policy
)

但是,當我通過JPA執行該查詢時,它會引發一個異常:

ERROR: missing FROM-clause entry for table <<t5>>  
  SELECT t7.idpolicynamedobject, t7.type, t7.description, t7.name, t0.idoperationalobjective, t0.idobjectivescategory 
    FROM public.OperationalObjective t0 INNER JOIN public.PolicyNamedObject t7 ON t0.idoperationalobjective = t7.idpolicynamedobject 
    WHERE (NOT (t0.idoperationalobjective IN 
    (
        SELECT t5.idoperationalobjective 
            FROM public.OperationalObjective t1 CROSS JOIN public.Goal t2 CROSS JOIN public.policy t3 
                INNER JOIN public.PolicyNamedObject t4 ON t3.idpolicy = t4.idpolicynamedobject 
                INNER JOIN public.PolicyNamedObject t6 ON t5.idoperationalobjective = t6.idpolicynamedobject, public.OperationalObjective t5 
            WHERE (t2.idpolicy = ? AND t2.idoperationalobjective = t5.idoperationalobjective 
                AND t3.idpolicy = ?) AND t6.type = ?))) AND t7.type = ?} [code=0, state=42P01]

我已經使用PgAdmin執行了SQL語句,它檢索了我想要的內容,但是我不知道我在做錯什么,將其轉換為JPQL ...知道嗎?

先感謝您 :)

我懷疑您將需要重構JPQL語句以使用子查詢“ EXISTS”,因為IN語句不支持子選擇。 希望這將為您指明正確的方向。

SELECT oo FROM OperationalObjective oo 
WHERE NOT EXISTS 
(
   SELECT oosub
   FROM OperationalObjective oosub
   JOIN oosub.goal g 
   JOIN g.policy p   
   WHERE <<where conditions>> 
) 

Oracle文檔

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM