web-dev-qa-db-ja.com

Hibernateで日付操作を実行する方法

Hibernate HQLを使用してデータ時間操作を実行したい。

2つの日付を加算および減算し、特定の日付から1年または1か月を減算します。

休止状態でHQLを使用してこれをどのように実行できますか?

14
amar4kintu

例については、 HQLで日付/時刻の計算を実行する を参照してください。

カスタムSQLを使用するには、独自の休止状態の方言を作成して登録する必要があります。

registerFunction("weekday", 
  new SQLFunctionTemplate(Hibernate.INTEGER, "to_char(?1,'D')") );
6
H2000

独自の方言を作成する必要があります。次のようなもの:

public class MyDialect extends MySQLInnoDBDialect{
      public myDialect() {
      super();
      registerFunction("date_add_interval", new SQLFunctionTemplate(Hibernate.DATE, "date_add(?1, INTERVAL ?2 ?3)"));
      }
    }
9
z5h

これはHibernateの未解決の問題です。 Hibernate 3.3以降、HQLで純粋に日付比較を処理する標準的な方法はありません。

https://hibernate.atlassian.net/browse/HHH-2434

Hibernate 4.3は、HQLの日付/時刻にアクセスするための関数を提供します。

current_timestamp() , current_date() , current_time()

算術演算は次の方法で管理できます。

SECOND(...) , MINUTE(...) , HOUR(...) , DAY(...) , MONTH(...) , YEAR(...)
4
Fred Haslam

Hibernate/MySQL(少なくとも)では、Unixタイムスタンプとの間で変換できます。 UNIXタイムスタンプは整数であるため、整数の秒数を追加できます。

FROM_UNIXTIME(UNIX_TIMESTAMP(date)+ (allowedTimeWindow*86400)) as deadline

これには制限がありますが、上記のアプローチよりもはるかに簡単です。

4
Dean Mathieson

免責事項:私はJava初心者です

関数を登録せずに、Hibernate 3.5.3のSybase dbに対してHQLステートメントでcurrent_date() >= fromDate AND dateadd(day, -1, getdate()) <= toDateを使用できました。

1
foson

JPA + Hibernate 4.3.1 + MySQL 5の方言によるアプローチの使用例

パブリッククラスSampleMySQL5InnoDBDialect extends org.hibernate.dialect.MySQL5InnoDBDialect {

public SampleMySQL5InnoDBDialect() {
    super();
    registerFunction("date_sub_days", new SQLFunctionTemplate(StandardBasicTypes.DATE, "date_sub(?1, interval ?2 day)"));
}

次に、マッピングアノテーションを含むクラスの場合:

@NamedQuery(name = "SampleEntity.getSampleEntitiesForGapOverlapCalculations", query = "from SampleEntity as se where "
    + "((se.toDate between :startDate and :endDate) or (date_sub_days(se.toDate, se.duration) between :startDate and :endDate)) order by se.toDate asc, se.duration desc")

SampleEntityにはtoDate Java.sql.Dateタイプのフィールドとdurationがあります整数フィールド(日数での期間)--fromDate = toDate-durationを計算し、-を持つすべてのエンティティを選択していますfromDateまたはtoDate区間内[startDate、endDate]

0
ydrozhdzhal

Postgresユーザー...

registerFunction("dateadd", new SQLFunctionTemplate(StandardBasicTypes.DATE, "(?1 + INTERVAL ?2)"));

次のようなSQLの使用法:

now() < dateadd(:mydate, '-1 day')
0
Joseph Valerio

Hibernate4.3は、日付/タイムスタンプにアクセスし、それらに算術演算を実行するためのネイティブ関数を提供します

ここ は、HQLで使用できる式のドキュメントへのリンクです。私が言及しているもののいくつか:日付/時刻にアクセスするには:

current_date(), current_time(), and current_timestamp()

算術演算は以下のように行うことができます。これらの関数は、時間を入力として受け取ります。

second(...), minute(...), hour(...), day(...), month(...), and year(...)

HQLの絶対差を得ることができます

current_timestamp() - dateInstance

ここで、dateInstanceは定義を持つことができます

@Column(name = "updated_at")
@Temporal(TemporalType.TIMESTAMP)
private Java.util.Date updatedAt;

結果は0.1秒です。したがって、1秒の絶対差の場合、上記の式では結果が10になります。

したがって、クエリは次のようになります。

select t from Table t where (current_timestamp() - updatedAt)>600
0
Nikhil Sahu