【问题标题】:Subquery with Inner Join in HQLHQL 中带有内部联接的子查询
【发布时间】:2018-09-14 00:04:02
【问题描述】:

我想从在 Rating 表中具有外键 Movie_id 的 Movies 表中打印标题。在 rating 表中,我们必须根据 movie_id 的出现来获得前 10 个结果。由于 HQL 中不允许限制,所以 setMaxResults 被使用

Query q=session.createQuery("select Title from Movies  as M Inner Join ( SELECT Movie_id, COUNT(*)  FROM Rating  GROUP BY Movie_id ORDER BY COUNT(*) DESC LIMIT 10 ) as R ON M.Movie_id=R.Movie_id").setMaxResults(10);

例外情况是:

java.lang.IllegalArgumentException: org.hibernate.hql.internal.ast.QuerySyntaxException: unexpected token: ( near line 1, column 59 [select Title from com.rahul.model.Movies  as M Inner Join ( SELECT Movie_id, COUNT(*)  FROM com.rahul.model.Rating  GROUP BY Movie_id ORDER BY COUNT(*) DESC LIMIT 10 ) as R ON M.Movie_id=R.Movie_id]

既然HQL不支持子查询怎么实现呢?

【问题讨论】:

标签: java mysql sql hibernate hql


【解决方案1】:

您可以将此查询编写为JOIN/GROUP BY

select m.Title
from Movies m Inner Join
     Rating r
     on m.Movie_id = r.Movie_id
group by m.Movie_Id, m.Title
order by count(*) desc
limit 10;

【讨论】:

  • @ Gordon Linoff Query : ' Query q=session.createQuery("select m.title from Movies m Inner Join Rating r on m.movi​​e_id = r.movi​​e_id group by m.movi​​e_Id, m.title按计数排序(*) desc 限制 10"); ' HQL 不支持限制
  • 异常:org.springframework.web.util.NestedServletException:请求处理失败;嵌套异常是 java.lang.IllegalArgumentException: org.hibernate.hql.internal.ast.QuerySyntaxException: 意外令牌:第 1 行附近的限制,第 161 列 [select m.title from com.rahul.model.Movies m Inner Join com.rahul .model.Rating r on m.movi​​e_id = r.movi​​e_id group by m.movi​​e_Id, m.title order by count(*) desc limit 10]
【解决方案2】:

已解决

Query q=session.createQuery("select m.title from Movies m Inner Join Rating r on m.movie_id = r.movie_id group by m.movie_id, m.title order by count(*) desc").setMaxResults(10);

【讨论】:

    猜你喜欢
    • 2019-06-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多