繁体   English   中英

使用 Hibernate Criteria 按子查询结果排序

[英]Sorting by subquery result using Hibernate Criteria

我正在尝试将此 SQL 查询转换为 Hibernate Criteria,但我不太确定如何,因为我对 Hibernate 非常陌生。

SELECT header.*,
(SELECT items.end_date from
    subTable sub,
    ItemTable items
    WHERE items.sub_id = sub.sub_id
    and header.header_id = sub.header_id
    order by items.end_date desc
    limit 1) as latestEndDate
from headerTable header
order by latestEndDate desc;

我可以创建子查询,但我不知道如何将它合并到主查询中。

Long headerId = getHeaderId();
Criteria criteria = session.createCriteria(dataaccess.model.Item.class, "item");

DetachedCriteria headerSubQuery =
    DetachedCriteria.forClass(dataaccess.model.Header.class, "header")
.setProjection(Property.forName("header.headerId"))
.add(Restrictions.eq("headerId, headerId));

DetachedCriteria subTableQuery =
    DetachedCriteria.forClass(dataaccess.model.SubTable.class, "sub")
.setProjection(Property.forName("sub.subId)).add(
    Property.forName("header").in(headerSubQuery));

criteria.add(Property.forName("sub").in(subTableQuery));
criteria.addOrder(Order.desc("endDate"));
criteria.setMaxResults(1);

List<Items> items = criteria.list();

*HeaderTable 和 SubTable 具有 1:1 的关系,并且仅出于遗留原因而存在。 SubTable拥有Items,但是由于1:1的关系,HeaderTable也拥有Items(HeaderTable -> SubTable -> Items)。

该查询返回具有最新结束日期的项目。 我希望能够使用 Hibernate 查询标题表并按最新的 endDate 对其项目之一(如上面的 SQL 查询中所示)进行排序。

谢谢你的帮助。

我最终通过向我的 Header 模型添加另一个字段并使用 @Formula 注释传递我的 SQL 查询来解决这个问题。

@Formula("(SELECT items.end_date from "
    + "subTable sub, "
    + "ItemTable items "
    + "WHERE items.sub_id = sub.sub_id "
    + "and header.header_id = sub.header_id "
    + "order by items.end_date desc "
    + "limit 1)")
private Date latestStartDate;

public getLatestStartDate() {
    return latestStartDate;
}

这使我可以将订单附加到我的标准中:

criteria.addOrder(Order.desc("latestStartDate"));

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM