【问题标题】:hibernate : convert complicated hql to criteriahibernate:将复杂的 hql 转换为标准
【发布时间】: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


【解决方案1】:

我们可以通过添加子查询来添加功能。我将 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));

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2011-07-30
  • 2015-10-18
  • 2014-09-14
  • 1970-01-01
  • 1970-01-01
  • 2011-01-29
  • 1970-01-01
  • 2011-08-25
相关资源
最近更新 更多