2015-05-21 5 views
0

Я это MySql запросов, этот запрос возвращает имя тега с соответствующими метриками, запрос отлично работает:Hibernate HQL Subquery

SELECT tag,m1.metric,m2.metric,m3.metric FROM yp_tag tag 
LEFT JOIN (
SELECT yt.id,count(*) as metric FROM yp_user_tag yut 
INNER JOIN yp_tag yt ON yut.tag_id=yt.id 
GROUP BY tag_id) AS m1 ON tag.id=m1.id 
LEFT JOIN (
SELECT yt.id,count(*) as metric FROM yp_promotion_tag ypt 
INNER JOIN yp_tag yt ON ypt.tag_id=yt.id 
GROUP BY tag_id) AS m2 ON tag.id=m2.id 
LEFT JOIN (
SELECT yt.id,count(*) as metric FROM yp_user_promo yup 
INNER JOIN yp_promotion_tag ypt ON yup.promotion_id=ypt.promotion_id 
INNER JOIN yp_tag yt ON ypt.tag_id=yt.id 
WHERE action='ACTION_VIEW' 
GROUP BY tag_id) as m3 ON tag.id=m3.id 

Возвращение запроса:

tag, metric, metric, metric 
'Almuerzo', '1', '1', NULL 
'Banamex', NULL, '2', NULL 
'Bar', '1', '2', NULL 
'Bebida', '1', '13', '1' 
'Boutique', NULL, '1', NULL 
'Caf', NULL, '2', NULL 
'Cena', '1', '7', NULL 
'Comida', '1', '5', NULL 
'Ejercicio', '1', '2', NULL 
'Enchilada', '1', NULL, NULL 
'Entrenamiento', '1', '15', NULL 
'Halcón', '1', NULL, NULL 
'Helado', '1', NULL, NULL 
'KFC', NULL, NULL, NULL 
'Latte', NULL, '2', NULL 
'Mañana', '1', '4', NULL 
'Nutrisa', '1', '6', '1' 
'Pizza', '2', '33', '10' 
'Ropa', '1', '4', NULL 
'Salud', '1', '3', NULL 
'Santa Fe', NULL, NULL, NULL 
'Tecnologia', NULL, '5', NULL 
'Valores', '1', '2', NULL 

я хочу сделать то же самое с Hibernate, но я не могу понять, как я могу это сделать, потому что hibernate не разрешает подзапрос в FROM, любые идеи, как я могу это сделать, не используя собственный SQL, конечно.

Благодаря

ответ

0

Я фиксирующий делаю этот SQL:

SELECT tag, (SELECT count(yt.id) FROM yp_user_tag yut 
      INNER JOIN yp_tag yt ON yut.tag_id=yt.id 
      WHERE tag.id=yt.id 
      GROUP BY tag_id) as m, 
      (SELECT count(*) as metric FROM yp_promotion_tag ypt 
      INNER JOIN yp_tag yt ON ypt.tag_id=yt.id 
      WHERE tag.id=yt.id 
      GROUP BY tag_id) AS m2, 
      (SELECT count(*) as metric FROM yp_user_promo yup 
      INNER JOIN yp_promotion_tag ypt ON yup.promotion_id=ypt.promotion_id 
      INNER JOIN yp_tag yt ON ypt.tag_id=yt.id 
      WHERE action='ACTION_VIEW' 
      AND tag.id=yt.id 
      GROUP BY tag_id) as m3 
      FROM yp_tag tag 

И HQL, как это:

Query q = sessionFactory.getCurrentSession().createQuery(
     "SELECT tag.tag, " 
       + " (SELECT count(*) as interestedCount FROM YpUserTag yut" 
       + " INNER JOIN yut.ypTag yt" 
       + " WHERE tag.id=yt.id" 
       + " GROUP BY yt.id) as interestedCount, " 
       + " (SELECT count(*) as promotionCount FROM YpPromotionTag ypt" 
       + " INNER JOIN ypt.ypTag yt" 
       + " WHERE tag.id=yt.id" 
       + " GROUP BY yt.id) as promotionCount, " 
       + " (SELECT count(*) as viewsCount FROM YpPromotionTag ypt" 
       + " INNER JOIN ypt.ypTag yt" 
       + " INNER JOIN ypt.ypPromotion.ypUserPromos yup" 
       + " WHERE tag.id=yt.id" 
       + " AND action='ACTION_VIEW'" 
       + " GROUP BY yt.id) as viewsCount"      
     + " FROM YpTag tag" 
     + " ORDER BY tag.tag" 
     );