2015-11-07 65 views
1

我试图将此SQL查询转换为Hibernate标准,但我不太清楚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)。

该查询返回带有最新endDate的项目。我希望能够使用Hibernate查询头表并根据最新的endDate对其中一个项目(如上面的SQL查询)进行排序。

感谢您的任何帮助。

回答

1

我最终解决了这个问题,在我的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"));