2012-08-09 61 views
1

我有一個數據庫表(休眠的conf全部完成),尋找下一個空閒時隙

ResourceRequest(resource, startTime, endTime, status) 

的開始時間和結束時間的資源被佔用之間。

問題陳述: 對於inStartTimeinEndTime的投入,我一定要找到下一個可用插槽如果在給定的位置已經被佔用。 必須爲此寫一個hibernate查詢。

一個快速的解決方案,我能想到的是: 查詢對於給定的資源resourcerequests到一個集合,然後操縱它來獲得下一個可用的插槽。

但我想要那個作爲我的最後手段。任何幫助表示讚賞。

謝謝。

+0

是否有當一個資源是狀態值*** ***不佔領?或者如果一個資源沒有被佔用,那麼這段時間裏根本沒有記錄?如果「未佔用」表示沒有記錄,是否可以將其更改爲具有未佔用狀態碼的記錄?並且同一資源的兩個記錄可以重疊嗎?最後,你如何代表時代?如果一個資源被佔用了一個小時,從中午開始,通常有'startTime = 12:00'和'endTime = 13:00' *(包括開始,獨佔結束)* - 這就是你所要做的在做什麼? – MatBailie 2012-08-09 08:11:38

+0

@Dems *沒有像佔用/未佔用的標誌。狀態欄表示審批狀態[此處未使用] 'resource1''09/08/2012 12:00''09/08/2012 13:00'已批准 *記錄不會重疊。 * startTime-12:00和endTime-13:00是正常的。但2個插槽不重疊。 – 2012-08-09 09:15:34

回答

1

在SQL

SELECT * FROM slots s1 WHERE 
    s1.endTime > :inStartTime AND 
    not exists (SELECT 1 FROM slots s2 WHERE s2.startTime > s1.endTime AND s2.startTime < DateAdd(s1.endTime, :inEndMinusInStart)) 
ORDER BY 
    s1.startTime 


// and criteria to tweak 

DetachedCriteria subquery = DetachedCriteria.for(Slot.class) 
    .add(<filter on resource>) 
    .add(Restrictions.propertyGt("startTime", "s1.endTime")); 
    .add(Restrictions.propertylt("startTime", Projections.sqlFunction("dateadd", Projections.property("s1.endTime"), inStartTime - inEndTime, Hibernate.dateTime)); 

session.createCriteria(Slot.class, "s1") 
    .add(<filter on resource>) 
    .add(Restrictions.gt(endTime, inStartTime)) 
    .add(Subqueries.notExists(subquery)) 

希望它有助於

+0

它絕對有幫助..謝謝。 – 2012-08-14 07:26:08