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