Hibernate HQLを使用してデータ時間操作を実行したい。
2つの日付を加算および減算し、特定の日付から1年または1か月を減算します。
休止状態でHQLを使用してこれをどのように実行できますか?
例については、 HQLで日付/時刻の計算を実行する を参照してください。
カスタムSQLを使用するには、独自の休止状態の方言を作成して登録する必要があります。
registerFunction("weekday",
new SQLFunctionTemplate(Hibernate.INTEGER, "to_char(?1,'D')") );
独自の方言を作成する必要があります。次のようなもの:
public class MyDialect extends MySQLInnoDBDialect{
public myDialect() {
super();
registerFunction("date_add_interval", new SQLFunctionTemplate(Hibernate.DATE, "date_add(?1, INTERVAL ?2 ?3)"));
}
}
これは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(...)
Hibernate/MySQL(少なくとも)では、Unixタイムスタンプとの間で変換できます。 UNIXタイムスタンプは整数であるため、整数の秒数を追加できます。
FROM_UNIXTIME(UNIX_TIMESTAMP(date)+ (allowedTimeWindow*86400)) as deadline
これには制限がありますが、上記のアプローチよりもはるかに簡単です。
免責事項:私はJava初心者です
関数を登録せずに、Hibernate 3.5.3のSybase dbに対してHQLステートメントでcurrent_date() >= fromDate AND dateadd(day, -1, getdate()) <= toDate
を使用できました。
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]。
Postgresユーザー...
registerFunction("dateadd", new SQLFunctionTemplate(StandardBasicTypes.DATE, "(?1 + INTERVAL ?2)"));
次のようなSQLの使用法:
now() < dateadd(:mydate, '-1 day')
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