概述:
我的hbm文件中有这些bean。首先是包含两个日期(报告的开始和结束)和排除期间列表的报告。其次是保留被排除的报告期。在这些被排除的时期内,报告被关闭。
<class name="com.company.Report" table="TReport">
<property name="startDate" column="m_StartDate" type="timestamp"/>
<property name="endDate" column="m_EndDate" type="timestamp"/>
<list name="excludedPeriods" table="TExcludedPeriod" inverse="true" lazy="false">
<key column="m_TReport" not-null="true"/>
<list-index column="m_ListIndex" base="1"/>
<one-to-many class="com.company.ExcludedPeriod"/>
</list>
</class>
<class name="com.company.ExcludedPeriod" table="TExcludedPeriod">
<id column="m_Id" name="id" />
<many-to-one name="report" class="com.company.JobsReport" column="m_TJobReport" not-null="true" />
<property name="index" column="m_ListIndex" type="integer"/>
<property name="start" column="m_Start" type="timestamp"/>
<property name="stop" column="m_Stop" type="timestamp"/>
</class>
任务:
选择在选定时间段内启用的所有报告(由startPeriod
和endPeriod
定义)。
我的代码:
SELECT * FROM treport r LEFT OUTER JOIN texcludedperiod ep ON r.m_id=ep.m_treport
WHERE NOT (ep.m_id IS NOT NULL AND (ep.m_start>=startPeriod AND ep.m_end<=endPeriod));
问题:
如果没有报告的排除期限或只有一个这样的期间,它会起作用,但在其他情况下,它会选择不应该选择的报告。考虑这个例子(d / m / yyyy格式):
报告:2000年1月1日开始,停止1/2/2000,排除期间: 7/1 / 2000-10 / 1 / 2000,12 / 1 / 2000-15 / 1/2000
搜索期间:startPeriod 8/1/2000,stopPeriod 9/1/2000。
不应选择此报告。