2015-11-07 83 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"));