16

I have a table (in Oracle 9 and up) where I need to find all entries for a given day using Hibernate. The entries have timestamps (with data type 'date'). Some of the entries have a time, others only have a date. This can not be changed, as this is the output of other applications which I can not change. In SQL I would write something along the lines of

SELECT * FROM table WHERE trim(table.date) = to_date('11.06.2009')

to get all entries for the date I am looking for. I was wondering how I can get Hibernate to do this using HQL. I know I can use SQL-queries in Hibernate, but this seems to be less clean. Is there a way to do this? If possible, this way should also work on non-oracle databases where timestamp would be the data type.

4

4 に答える 4

15

HQLに2つの制約を設定できます。1つは検索している日付の開始日以上を指定し、もう1つは翌日未満を指定します。

すなわち

table.date >=11.06.2009 AND table.date < 11.07.2009

HQL(およびSQL)では、次のことも可能です。

table.date between 11.06.2009 AND 11.07.2009

between常に包括的であることに注意してください。つまり>=<=それぞれとの両方です。
詳細はbetweenこちら: http: //www.coding-dude.com/wp/java/hibernate-java/hibernate-hql-between-expression/

于 2009-06-11T10:34:25.583 に答える
2

CustomHQLの場合、 truncキーワードを試すことができます

例:

SELECT T0.FirstName as FirstName ,T0.LastLoginDate as LastLoginDate  FROM User T0
WHERE (trunc(T0.LastLoginDate) >= :LastLoginDate) ORDER BY T0.LastLoginDate 

注:パラメータはどこ:LastLoginDateにありますか。

これは私にとってはうまくいきます。

于 2011-01-06T12:01:33.333 に答える
2

これを解決するには、次の 2 つの方法があると思います。

  1. 条件クエリを使用して、 SQLRestrictionを追加します。制限は、"trim({alias}.date) = ?" の形式になります。ここでの問題は、Oracle (または他の DBMS) での入力パラメーターの正しい型への変換である可能性があります。必要な (休止状態の) タイプをパラメーターとして指定できますが、これがデータベースに依存する場合は、ハードコーディングされます。

  2. 休止状態のマッピングで数式を使用します。マッピングは次のようになります。

    <class name="Person">
      <property name="birthDay" formula="trim(birthDay)"/>
    </クラス>

Hibernate の型付けシステムを使用して、次のような Java オブジェクトとの比較を使用できるようになりました。

s.createCriteria(Person.class)
 .add(Restrictions.eq("birthDay", new java.sql.Date(System.currentTimeMillis())))
 .list()

両方のソリューションで発生する問題の 1 つは、trim関数がデータベースで使用できない可能性があることです。これに対する解決策 (たとえば、HSQLDB でのテスト中) は、クラスパス テスト (これは Hibernate によって自動的に取得されます) に import.sql を配置し、そこにプロシージャまたは関数を作成することです。Alter table Person add column birthDay timestamp そのファイルで、生成されたスキーマを機能させることもできます。

于 2009-06-11T17:35:59.813 に答える
-1

trunc() 関数を使用して、DATE 列の時刻部分を削除できます。

例:select * from emp where trunc(emp_date) < trunc(current_date()-30)

1 か月前に雇用されていたすべての従業員の詳細を取得します

于 2009-11-11T11:24:32.927 に答える