以下是我的sql语句:SELECT * FROM
(select * from album as b order by b.publishtime desc limit 10) as a
order by a.click desc limit 5;
 语句功能是先在专辑表中找出10个最后发布的专辑,然后在这10个专辑中找出点击数最多的5个专辑。hql语句不支持子表查询,而且子表里面也不知道如何实现limit 10 这个功能(括号里面的)。
现在越来越感觉hql不好用了,似乎一点都不灵活,很考验人呀,据说是任何sql语句都可以转换为hql,但是自己对hql还不熟悉呀,一点没感觉到hql能跟sql的灵活性相比。
希望各位高手给我解答! 

解决方案 »

  1.   

    hql是在有框架的基础上进行查询的
    查询时用的比较多的是
    org.hibernate.criterion.Restrictions
    用于加查询限制很轻松的、
      

  2.   

    用QBC查询啦,子查询很简单的
      

  3.   

    HQL 并不是万能的,如果 SQL 能实现的话就用 SQL 去实现,不要过分地依赖于 HQL,并不是所有的 SQL 都有转为 HQL 的。
      

  4.   

    首先你的sql有点问题,为什么要查询出结果集,然后又查询结果集中的行呢,
    可以直接查询的, 
    select * from album as b order by b.publishtime desc,b.click desc limit 5;
    两种方法:
    第一种是直接用sql查询数据:
    Query query = session.createSQLQuery("select * from album as b order by b.publishtime desc,b.click desc limit 5");
    List<Object []> results = (List<Object []>)query.list();
    这个results链表的每个元素是一个对象数组,数组的顺序就是你在select 后面
    列出的顺序,最好不要用*号代替,用*号的话数据库会先查询表的列名,所以
    性能要差一点。
    第二种是用HQL查询:
    Album 是个持久化的类
    Query query = session.createQuery("from Album a order by a.publishtime desc,a.click desc");
    query.setFirstResult(0);
    query.setMaxResults(5);
    List<Album> results = query.list();
      

  5.   

    第三种用Criteria查询:
    List<Album> results = session.createCriteria(Album.class).addOrder(Order.desc("publishtime")).addOrder(Order.desc("click")).setFirstResult(0).setMaxResults(5).list();