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