2012-01-16 3 views
3

時間単位でエンティティを選択します。 日付と時刻を含むフィールド型DATEを持つOracle DBMSがあります。これは私のコードです。時間基準でデータを選択する方法は?Hibernate CriteriaとOracleを使用して、時間を使って作業するより良い方法は何ですか?

Calendar timeCal = new GregorianCalendar(0,0,0,0,0,0); 
Date  timeMin = timeCal.getTime(); 

timeCal.add(Calendar.HOUR_OF_DAY, 1); 
Date  timeMax = timeCal.getTime(); 

if (minDate != null && maxDate != null) 
    criteria.add(Restrictions.between("eventDate", minDate, maxDate)); 

if (onDate != null) { 
    Calendar calendar = Calendar.getInstance(); 
    calendar.setTime(onDate); 
    calendar.add(Calendar.DAY_OF_MONTH, 1); 
    criteria.add(Restrictions.between("eventDate", onDate, calendar.getTime())); 
} 

if(minTime!=null&&maxTime!=null){ 
    /* 
     How to add Restriction on eventDate field, for time only? 
     if minTime is 3:00 and maxTime is 16:00, must to return 
     all rows having the time part of their eventDate between 
     3:00 and 16:00, regardless of the date part 
    */ 
} 
+2

投稿したコードの問題点を教えてください。 –

+0

実装されていませんminTime!= null && maxTime!= null式 – Selector

+0

これらの基準が何であるか、およびクエリが何をすべきかはわかりません。 –

答えて

2

で発見することができ、私は答えを見つけます。ちょうどsqlRestrictionを使用する必要があります。

criteria.add(
    Restrictions.sqlRestriction(
     " NUMTODSINTERVAL(EVENT_DATE - TRUNC(EVENT_DATE), 'DAY') BETWEEN NUMTODSINTERVAL (?,'SECOND') AND NUMTODSINTERVAL (?,'SECOND')", 
     new Object[] { secondsForBegin, secondsForEnd }, 
     new Type[] { StandardBasicTypes.INTEGER, StandardBasicTypes.INTEGER })); 
0

あなたはそれを行うにはSQLの制限を使用する必要があります、または、できれ、あなたは適切なSQLの制限を発行するであろう、独自の基準の実装を作成する必要があります。

例として、org.hibernate.criterion.IlikeExpressionクラスを使用してください。PostgreSQL方言を使用していない場合は、式の引数がvalue.toString().toLowerCase()lower(columnName) like ?というSQL式が生成されます。

あなたの基準は、to_date(to_char(columnName, 'HH24:MI:SS'), 'HH24:MI:SS') < ?)のようなものを生成します。ここで、あなたの式の引数はあなたの最大時間です。 (そしてもちろん、分の時間のために同様の基準を行う)

+0

非常に汚い方法。 – Selector

1

HibernateはHQLは、この特定のケースで使用することができますhourminutesecond機能を持っているので、あなたではなく、SQLよりも、HQLでこれを行うことができます。したがって、Criteriaオブジェクトの代わりにHQLクエリが必要になります。 HQLは

あなたが適切 :minSeconds:maxSecondsパラメータを設定します
from tableName 
where eventDate between :minDate and :maxDate 
    and 3600 * hour(eventDate) + 60 * minute(eventDate) + second(eventDate) 
     between :minSeconds and :maxSeconds 

ようになります。 :maxDateでもアウト・バイ・ワン・エラーに注意してください。 HQLの

詳しい情報はhttp://docs.jboss.org/hibernate/core/3.3/reference/en/html/queryhql.html

+0

クエリはhqlとデータのみの部分で非常に大きいです。 – Selector