【问题标题】:Criteria API. Sort by latest child标准 API。按最新的孩子排序
【发布时间】:2013-03-15 14:44:36
【问题描述】:

我在完成我认为应该很容易的事情时遇到了巨大的困难。

基本上我有一个 OrderBean 和一个 OrderInsertBean。它们都是映射到 mySQL 表的实体。一个 OrderBean 可以有多个 OrderInsertBean,而一个 OrderInsertBean 只有一个 OrderBean。

我正在编写 Hibernate Criteria 查询来构建一个动态查询,该查询将从这些表中搜索和排序结果。它大部分工作正常,除非我尝试按下一个 OrderInsertBean 对订单进行排序。

你看,OrderInsertBean 有一个 insertDate,对于每个 Order,我想选择第一个 insertDate 大于今天的 OrderInsert,并按此日期对订单进行排序。

在纯 SQL 中足够简单。可以用多种方式编写,但这是一种方法:

select o.*, (select min(oi2.insertDate) 
from AIDA_ORDER_INSERT oi2 where oi2.insertDate > curdate() 
and oi2.orderId = o.orderId) as insertDateNew 
from AIDA_ORDER o 
order by insertDateNew

但是 * 怎么可以写成 Hibernate Criteria 查询呢?或者 JPA 2 Criteria Query 也不错。

这是我所知道的……

Criteria crit = session.createCriteria(OrderBean.class, "order");
DetachedCriteria subquery = DetachedCriteria.forClass(OrderInsertBean.class, "oi");
subquery.add(Restrictions.ge("oi.insertDate", new Date()));

ProjectionList projectionList = Projections.projectionList();
projectionList.add(Projections.min("oi.insertDate"));
projectionList.add(Projections.groupProperty("oi.orderId"));
subquery.setProjection(projectionList);

// How to add the subquery to the main query to get the desired results??

// Finally ordering the results:
crit.addOrder(Order.asc("insertDateNew"));

我认为我需要以某种方式将子查询添加到条件选择列表中,给它一个别名,然后按它排序...

但我卡住了,不知道去哪里。 谁能帮助一个可怜的家伙?

谢谢

【问题讨论】:

    标签: hibernate hibernate-criteria


    【解决方案1】:

    您是否尝试将Order 添加到条件中?

    喜欢:

    crit.addOrder(Order.asc("insertDateNew"));
    

    【讨论】:

    • 嗯,呃...是的。 addOrder 不是这里的问题。我已经控制住了。困难的是我如何将子查询添加到主查询中以获得上述 sql 定义的结果。目前我的代码根本不起作用。
    • 当我评论时,addOrder 不在您的问题中,这似乎是显而易见的答案(对我来说)。
    【解决方案2】:

    您已经映射了 Order 和 OrderInsert 之间的关联。这不行吗?

    Criteria crit = session.createCriteria(OrderBean.class, "order");
    
    crit.createAlias("orderInserts", "oi");
    
    crit.add(Restrictions.ge("oi.insertDate", new Date()));
    
    ProjectionList projectionList = Projections.projectionList();
    projectionList.add(Projections.min("oi.insertDate"));
    projectionList.add(Projections.groupProperty("oi.orderId"));
    crit.setProjection(projectionList);
    
    // Finally ordering the results:
    crit.addOrder(Order.asc("oi.insertDateNew"));
    

    【讨论】:

      猜你喜欢
      • 2021-08-15
      • 2012-08-16
      • 2021-09-12
      • 2020-05-04
      • 1970-01-01
      • 2013-01-01
      • 2012-11-07
      • 2018-08-06
      • 2015-03-16
      相关资源
      最近更新 更多