我有一个表,“报价”,在休眠中映射,它有一个整数 id 和一个日期的复合键,以及几个附加列。我想编写一个条件查询,该查询使用 DetachedCriteria 来获取每个 id 具有最大日期的行。
在 sql 中,我可能会编写如下查询
SELECT * FROM Quote q1
INNER JOIN (SELECT id, max(date) as maxdate FROM Quote
GROUP BY id, date) q2
ON q1.id = q2.id AND q1.date = q2.maxdate
在休眠中,我认为可以像这样为“group by”子查询创建一个 DetachedCriteria(其中 Quote 是映射表的类,而“Qid”是键的复合 id 类,具有属性 id 和 date,由 a Quote 类的“qid”属性):
DetachedCriteria maxDateQry = DetachedCriteria.forClass(Quote.class);
maxDateQry.setProjection(
Projections.projectionList()
.add(Projections.max("qid.date", "maxdate"))
.add(Projections.groupProperty("qid.id")));
但是,我不确定如何在与上面的 sql 外部部分等效的条件查询中使用它。我正在寻找类似的东西
Criteria criteria = session.createCriteria(Quote.class);
criteria.add(
Restrictions.and(
Property.forName("qid.id").eq(maxDateQry???),
Property.forName("qid.date").eq(maxDateQry???)));
List<Quote> quoteList = criteria.list();
上面的两个 Property.forName 将外部表与子查询的相应列相关联。如果内部连接只提供一个值,我将简单地给 DetachedCriteria 一个单一的 Projection,并将 DetachedCriteria 直接传递给 Property.forName(...).eq(..)。我不确定如何在 Projection 中使用具有两个值(id 和 maxdate)的 DetachedCriteria。