2010-03-04 121 views
0

任何人都可以幫助我將以下本地查詢轉換爲命名查詢?JPA + Hibernate +命名查詢+如何加入子查詢結果

原生查詢:

 
SELECT 
     usr1.user_id, urr1.role_id, usr2.user_id, urr2.role_id, usr1.school_id, 
     term.term_name, count(material.material_id) as "Total Book Count", 
     fpc.FOLLETT_PENDING_COUNT as "Follett Pending Count", 
     rrc.RESOLUTION_REQUIRED_COUNT as "Resolution Required Count" 
FROM va_school sch 

JOIN va_user_school_rel usr1 on sch.school_id=usr1.school_id 
JOIN va_user_role_rel urr1 on usr1.user_id=urr1.user_id and urr1.role_id=1001 
JOIN va_user_school_rel usr2 on sch.school_id=usr2.school_id 
JOIN va_user_role_rel urr2 on usr2.user_id=urr2.user_id and urr2.role_id=1002 
JOIN va_term term on term.school_id = usr1.school_id 
JOIN va_class course on course.term_id = term.term_id 
JOIN va_material material on material.class_id = course.class_id 

LEFT JOIN 
     (SELECT VA_CLASS.TERM_ID as "TERM_ID", COUNT(*) as "FOLLETT_PENDING_COUNT" 
     FROM VA_CLASS JOIN VA_MATERIAL ON VA_MATERIAL.CLASS_ID = VA_CLASS.CLASS_ID 
     WHERE VA_CLASS.reference_flag = 'A' AND trunc(VA_MATERIAL.FOLLETT_STATUS) = 0 
     GROUP BY VA_CLASS.TERM_ID) fpc on term.term_id = fpc.term_id 

LEFT JOIN 
     (SELECT VA_CLASS.TERM_ID as "TERM_ID", COUNT(*) as "RESOLUTION_REQUIRED_COUNT" 
     FROM VA_CLASS JOIN VA_MATERIAL ON VA_MATERIAL.CLASS_ID = VA_CLASS.CLASS_ID 
     WHERE VA_CLASS.reference_flag = 'A' AND trunc(VA_MATERIAL.FOLLETT_STATUS) = 1 
     GROUP BY VA_CLASS.TERM_ID) rrc on term.term_id = rrc.term_id 
WHERE course.reference_flag = 'A' 
GROUP BY usr1.user_id, urr1.role_id, usr2.user_id, urr2.role_id, usr1.school_id, term.term_name, fpc.FOLLETT_PENDING_COUNT, rrc.RESOLUTION_REQUIRED_COUNT 
ORDER BY usr1.school_id, term.term_name; 

在此先感謝。

  • 斯里裏

回答

0

我建議這個移動存儲過程和呼叫從JPA存儲過程。

0

根據您的對象對象模型,你應該考慮你的查詢的目的。查看你的SQL語句在語義上是一個問題,如果應該制定一個HQL查詢。

儘管如此,在基於Hibernate的應用程序中創建theta風格的查詢甚至可以作爲命名查詢是可能的 - 而且通常也是如此。

HQL查詢大多數時間看起來像本地一樣,它使用對象模型的關係。這些關係對方式有很大的影響,查詢可能會被定義。而不是從School實體開始。他們可能從User數據集開始。

SELECT .... 
FROM User user1, User user2 
JOIN User.school as school 
... 
WHERE school = user2.school 

這實在是更容易跟隨to one關係,因此我通常重塑我的查詢的方式,他們往往會執行我的方式。