【发布时间】:2014-01-20 21:44:40
【问题描述】:
我有一个任务实体,有一个站点
实体
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;
}
}
HQL
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)。
但首选标准。
我尝试了以下代码,但无法将have子句转换为条件。
标准
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));
【问题讨论】:
-
我希望您正在使用标准 API 进行练习。在大多数情况下,HQL 方法更加灵活、可读和可维护。当您需要根据用户输入实施限制时,通常使用 Criteria API。由于您的查询是静态的,因此我认为转换没有任何好处。
标签: java sql-server hibernate hql criteria