2017-11-28 4 views
0

概要日付:私は私のHBMファイルにこれらのBeanを持ってSELECT文のOneToMany関係に基づくと

を。第1に、2つの日付(レポートの開始と停止)と除外された期間のリストがあるレポートです。第二は、報告期間を除外したことです。除外された期間にレポートがオフになります。

<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> 

タスク:

は時間(startPeriodendPeriodによって定義される)の選択期間にオンされているすべてのレポートを選択します。

マイコード:

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形式):

報告1/1/2000を開始し、2000年1月2日を停止し、除外期間: 7月1日/ 2000-10/1/2000、 12/1/2000-15/1/2000

検索期間:startPeriod 8/1/2000、stopPeriod 9/1/2000

このレポートは選択しないでください。

+0

私の脳はどこにいなくても... それはどこに翻訳されますか?(ep.m_idはヌルか(ep.m_start endperiod))? – Rene

答えて

1

これはEXISTSあなたは、NOTを使用する必要があり、それらの例です:

SELECT * 
    FROM treport r 
    WHERE NOT EXISTS (SELECT * 
         FROM texcludedperiod ep 
         WHERE ep.m_treport = r.m_id AND 
          ep.m_start >= startPeriod AND 
          ep.m_end <= endPeriod); 

は、基本的には、「私に何の除外が問題の報告期間中に存在しないすべてのレポートを与える」言っています。

+0

私は反対の不平等が必要ですが、これはありがとうございます。今私はこれをHibernate Criteriaに翻訳しなければなりません:D –

関連する問題