【发布时间】: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