2016-05-14 69 views
0

我正在使用Hibernate 4.3.11和MySQL 5.7.11。
我想這個MySQL查詢重寫HQL:on子句中的未知列 - 在查詢中從SQL轉換爲HQL

SELECT COALESCE(g1.id, g2.id) as id, COALESCE(g1.type, g2.type) as type, COALESCE(g1.email_id, g2.email_id) as email_id, COALESCE(g1.url_id, g2.url_id) as url_id FROM notifications n 
LEFT JOIN emails ON emails.id = n.email_id 
LEFT JOIN urls ON urls.id = n.url_id 
LEFT JOIN notifications_group g1 ON g1.email_id = n.email_id 
LEFT JOIN notifications_group g2 ON g2.url_id = n.url_id 
WHERE (((n.type = 'EMAIL' OR n.type = 'REMINDER') AND n.email_id is not null AND emails.user_id = :userId) 
     OR (n.type = 'URL' AND n.url_id is not null AND urls.user_id = :userId)) 
     AND (g1.id is not null OR g2.id is not null) 
     AND ((g1.id is not null AND g1.id < :beforeId) OR (g2.id is not null AND g2.id < :beforeId)) 
GROUP BY COALESCE(g1.id, g2.id) 
ORDER BY MAX(n.id) DESC 

我重寫了這個本地查詢HQL:

SELECT COALESCE(g1.id, g2.id), COALESCE(g1.type, g2.type), COALESCE(g1.email, g2.email), COALESCE(g1.url, g2.url) FROM Notification n 
LEFT JOIN n.email e 
LEFT JOIN n.url u 
LEFT JOIN e.notificationGroup g1 
LEFT JOIN u.notificationGroup g2 
WHERE (((n.type = delimail.enums.NotificationType.EMAIL OR n.type = delimail.enums.NotificationType.REMINDER) AND e IS NOT NULL AND e.user = :user) 
     OR (n.type = delimail.enums.NotificationType.URL AND u IS NOT NULL AND u.user = :user)) 
     AND (g1 IS NOT NULL OR g2 IS NOT NULL) 
     AND ((g1.id IS NOT NULL AND g1.id < :beforeId) OR (g2 IS NOT NULL AND g2.id < :beforeId)) 
GROUP BY COALESCE(g1.id, g2.id), COALESCE(g1.type, g2.type), COALESCE(g1.email, g2.email), COALESCE(g1.url, g2.url) 
ORDER BY MAX(n.id) 

但它不工作。 Hibernate生成的這個查詢:

SELECT coalesce(notificati3_.id, notificati4_.id) AS col_0_0_, 
     coalesce(notificati3_.type, notificati4_.type) AS col_1_0_, 
     coalesce(notificati3_.email_id, notificati4_.email_id) AS col_2_0_, 
     coalesce(notificati3_.url_id, notificati4_.url_id) AS col_3_0_ 
FROM delimail.notifications notificati0_ 
LEFT OUTER JOIN delimail.emails email1_ ON notificati0_.email_id=email1_.id 
LEFT OUTER JOIN delimail.notifications_group notificati3_ ON email1_.id=notificati3_.email_id, 
                  delimail.emails email5_, --l 8 
                  delimail.urls url7_ --l 9 
LEFT OUTER JOIN delimail.urls url2_ ON notificati0_.url_id=url2_.id --error: Unknown column 'notificati0_.url_id' in 'on clause' 
LEFT OUTER JOIN delimail.notifications_group notificati4_ ON url2_.id=notificati4_.url_id, 
                  delimail.emails email6_, --l 12 
                  delimail.urls url8_ --l 13 
WHERE notificati3_.email_id=email5_.id --l 14 
    AND notificati3_.url_id=url7_.id --l 15 
    AND notificati4_.email_id=email6_.id --l 16 
    AND notificati4_.url_id=url8_.id --l 17 
    AND ((notificati0_.type='EMAIL' 
     OR notificati0_.type='REMINDER') 
     AND (email1_.id IS NOT NULL) 
     AND email1_.user_id=? 
     OR notificati0_.type='URL' 
     AND (url2_.id IS NOT NULL) 
     AND url2_.user_id=?) 
    AND (notificati3_.id IS NOT NULL 
     OR notificati4_.id IS NOT NULL) 
    AND ((notificati3_.id IS NOT NULL) 
     AND notificati3_.id<? 
     OR (notificati4_.id IS NOT NULL) 
     AND notificati4_.id<?) 
GROUP BY coalesce(notificati3_.id, notificati4_.id), 
     coalesce(notificati3_.type, notificati4_.type), 
     coalesce(notificati3_.email_id, notificati4_.email_id), 
     coalesce(notificati3_.url_id, notificati4_.url_id) 
ORDER BY MAX(notificati0_.id) 

和錯誤是:

未知列 '的條款'
SQL警告代碼在 'notificati0_.url_id':1054 SQLSTATE:42S22

但是,刪除標記行8-9,12-13和刪除第14-17行中的條件後,此查詢按預期工作。
如何將此查詢轉換爲HQL?如果它是可能的。

+0

您的問題相當複雜,如上所述,並且缺少一些潛在響應者回答您的問題所需的代碼和模式詳細信息。我可以建議把它縮小到更簡單的東西,但仍然會出現問題嗎?另外,請包含相應的模式和相關的Java enum和Hibernate實體。請參閱http://stackoverflow.com/help/mcve以獲得進一步幫助,從而重新構建您的問題。 –

回答