Criteria API。按最新的孩子排序

时间:2013-03-15 14:44:37

标签: hibernate hibernate-criteria

我很难完成一些我认为应该很容易的事情。

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

我正在编写Hibernate Criteria查询以构建一个动态查询,该查询将对这些表中的结果进行搜索和排序。它主要工作正常,除非我试图通过下一个OrderInsertBean对订单进行排序。

你看,OrderInsertBean有一个insertDate,对于每个Order,我想选择第一个OrderDate比今天大的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 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"));

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

但我卡住了,不知道该往哪里去。 任何人都可以帮助一个可怜的家伙吗?

由于

2 个答案:

答案 0 :(得分:0)

您是否尝试在条件中添加Order

像:

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

答案 1 :(得分:0)

您已经在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"));