我很难完成一些我认为应该很容易的事情。
基本上我有一个 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"));
我认为我需要以某种方式将子查询添加到条件选择列表中,给它一个别名,然后按它排序......
但我卡住了,不知道去哪里。谁能帮助一个可怜的家伙?
谢谢