0

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

基本上我有一个 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"));

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

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

谢谢

4

2 回答 2

0

您是否尝试过Order在标准中添加一个?

喜欢:

crit.addOrder(Order.asc("insertDateNew"));
于 2013-03-15T15:05:33.580 回答
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"));
于 2013-03-16T14:58:26.037 回答