hibernate HQL を使用してデータ時間操作を実行したいと考えています。
特定の日付から 1 年または 1 か月を減算するだけでなく、2 つの日付を加算および減算したい。
休止状態でHQLを使用してこれをどのように可能にしますか?
独自の方言を作成する必要があります。次のようなもの:
public class MyDialect extends MySQLInnoDBDialect{
public MyDialect() {
super();
registerFunction("date_add_interval", new SQLFunctionTemplate(Hibernate.DATE, "date_add(?1, INTERVAL ?2 ?3)"));
}
}
HQL で日付/時刻計算を実行するを参照してください 。 たとえば。
カスタム SQL を使用するには、独自の hibernate ダイアレクトを作成して登録する必要があります。
registerFunction("weekday",
new SQLFunctionTemplate(Hibernate.INTEGER, "to_char(?1,'D')") );
これは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(...)
免責事項: 私は Java の初心者です
current_date() >= fromDate AND dateadd(day, -1, getdate()) <= toDate
関数を登録せずに、Hibernate 3.5.3 の Sybase データベースに対して HQL ステートメントで使用できました。
JPA + Hibernate 4.3.1 + MySQL 5 の方言によるアプローチの使用例
public class 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にはjava.sql.Date 型のtoDateフィールドと期間整数フィールド (日数) があり、fromDate = toDate - 期間を計算し、間隔[startDate, endDate]内にfromDateまたはtoDateを持つすべてのエンティティを選択します。