2012-08-09 108 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