首页 文章

on子句中的未知列 - 在查询中从SQL转换为HQL

提问于
浏览
0

我正在使用Hibernate 4.3.11和MySQL 5.7.11 .
我想将这个MySQL查询重写为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)

错误是:

'on clause'中的未知列'notificati0_.url_id'SQL警告代码:1054,SQLState:42S22

但是,在删除标记的行8-9,12-13并删除第14-17行中的条件之后,此查询将按预期工作 .
如何将此查询转换为HQL?如果它是可能的 .

1 回答

相关问题