我有一个任务实体,有一个网站
实体
public class Task {
// ....
@Column(name = "START_DATE")
@Temporal(value = TemporalType.TIMESTAMP)
public Date getStartDate() {
return startDate;
}
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "SITE_NO")
public Site getSite() {
return site;
}
}
高品质
select id from Task main
where exists (
select site.id, MAX(startDate) as latest_date from Task sub
group by site.id
having main.startDate = MAX(startDate)
)
上面的hql工作正常。结果集是所有任务GROUP BY站点和MAX(startDate)。
但优先选择Criteria。
我已经尝试了以下代码,但是无法将hading子句转换为条件。
标准
DetachedCriteria detachedCriteria = service.createDetachedCriteria();
detachedCriteria.setProjection(Projections.projectionList()
.add(Projections.groupProperty("site.no"))
.add(Projections.max("startDate"))
// [having clause]
);
Criteria criteria = service.createCriteria();
criteria.add(Subqueries.exists(detachedCriteria));
最佳答案
我们可以通过添加子查询来添加具有功能。我添加了max(startdate)作为内部查询来解决。
DetachedCriteria detachedCriteria = service.createDetachedCriteria();
detachedCriteria.setProjection(Projections.projectionList()
.add(Projections.groupProperty("site.no"))
.add(Projections.max("startDate"))
// [having clause]
);
Criteria criteria = service.createCriteria();
criteria.add(Subqueries.exists(detachedCriteria));
criteria.add(Subqueries.eq("startDate", innerQuery));
关于java - hibernate :将复杂的hql转换为条件,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20899975/