Hibernate Criteria:嵌套子查询(select * from(nested results))

时间:2017-05-17 10:13:21

标签: hibernate criteria hibernate-criteria nested-query

我有一个原始sql查询,我需要在hibernate 标准中编写。

原始sql查询我有:

SELECT 
        *
    FROM
    (
        SELECT
            *
        FROM
            Table t1 
        ORDER BY Sort1 DESC, Sort2 DESC, Sort3 DESC
    )
GROUP BY Age 
ORDER BY Sort1 DESC, Sort2 DESC, Sort3 DESC

它的作用是什么,

  1. 按照ORDER BY Sort1 DESC, Sort2 DESC, Sort3 DESC
  2. 对t1表格结果进行排序
  3. 为每个年龄组选择一行
  4. 按照ORDER BY Sort1 DESC, Sort2 DESC, Sort3 DESC
  5. 对分组结果进行排序

    注意)我在步骤2)之前需要步骤1)的原因是因为GROUP BY,是错误的,不保证排序,我需要应用严格的顺序来挑选单行年龄组

    我有一张表格如下: 表t1

    | ID |  Lastname  |  Firstname |  Age |  Created_at | Sort1 | Sort2 | Sort3  
    ---------------------------------------------------------------------------
    | 1  |    Jolie   |   Angey    |  40  |    2011     |   3   |   2   |   1
    | 2  |    Pitt    |   Brad     |  41  |    2012     |   2   |   1   |   2 
    | 3  |    Smith   |   Casey    |  40  |    2010     |   3   |   1   |   2
    | 4  |    Smith   |   Carey    |  40  |    2009     |   3   |   2   |   3
    ---------------------------------------------------------------------------
    

    从上面的sql查询返回的结果如下:

    | ID |  Lastname  |  Firstname |  Age |  Created_at | Sort1 | Sort2 | Sort3
    ----------------------------------------------------------------------------
    | 4  |    Smith   |   Carey    |  40  |    2009     |   3   |   2   |   3    
    | 2  |    Pitt    |   Brad     |  41  |    2012     |   2   |   1   |   2     
    

    似乎 DetachedCriteria 是前进之路,并且看到一些解决方案使用DetachedCriteria的结果提供给 where 子句,但是不是直接在 FROM 之后。

    所以我使用DetachedCriteria创建子查询,但不确定在哪里完成Criteria ..

    DetachedCriteria subQuery = DetachedCriteria.forClass(Some.class, "a")
            .addOrder(Order.desc("a.Sort1"))
            .addOrder(Order.desc("a.Sort2"))
            .addOrder(Order.desc("a.Sort3"));
    
    // stuck from below... :( 
    Criteria criteria = hibernateSession.createCriteria(??)
          .add(Projections.groupProperty("Age"))
    

    我非常感谢您深入了解如何去做。提前谢谢你:)

0 个答案:

没有答案