2012-11-26 9 views
8

HQLを使用してテーブルから期限切れのエンティティを取得したいとします。次のようなものがあります:HQLの日付操作

select id, name from entity_table where date_creation + 10_minutes < current_time() 

私はHQLでこれを行う方法を知りません。私は余分なクエリを作成したい、Javaコードで日付を処理するなど。これはHQLレベルで行う必要があります。

私を助けてもらえますか?

+0

データベースとは何ですか? –

答えて

10

データベースによっては、これは簡単に行うことができます。 HQLは組み込みのベンダー固有の機能をサポートしています。また、HQLでサポートされていない新しい関数を登録することで方言を拡張する機能もサポートしています。

SQLServer(またはSybase)を使用しているとします。 SQLServerには、非常に簡単に好きなことを実行できる「DATEADD」という機能があります。形式は次のとおりです。

この関数は、最初にHibernate Dialectに関数を登録することによって直接HQLで使用できます。これを行うには、現在使用している方言を拡張するだけです。これは非常に簡単なプロセスです。

まず、(置き換える「SQLServer2008Dialect」独自のDBベンダーに)独自の方言クラスを作成します。

public class MySQLServerDialect extends SQLServer2008Dialect { 

    public MySQLServerDialect() { 
    registerFunction("addminutes", new VarArgsSQLFunction(TimestampType.INSTANCE, "dateadd(minute,", ",", ")")); 
    } 

} 

次に、この新しいクラスを使用するように休止状態の設定を変更します。

<?xml version='1.0' encoding='utf-8'?> 
<!DOCTYPE hibernate-configuration PUBLIC 
    "-//Hibernate/Hibernate Configuration DTD 3.0//EN" 
    "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd"> 
<hibernate-configuration> 
    <session-factory> 
    ... 
    <property name="hibernate.dialect">com.mycompany.MySQLServerDialect</property> 
    ... 
</hibernate-configuration> 

select x from MyEntity x where addminutes(x.creationDate, 10) < current_time() 

(これはあなたのエンティティがMyEntityと呼ばれていることを前提としています。 creation_dateフィールドはcreationDateというプロパティにマップされます)。

3

HQLは日付と時刻の演算をサポートしていないため、HQLを拡張しなければ不可能です。最も簡単なパスはおそらく、そのような計算のためにデータベースベンダーのSQLダイアレクト関数を登録することです。他の可能性はプラス記号とマイナス記号の構文が好ましい場合にinterceptor(オーバーライド方法はonPrepareStatement)を実装して登録することです。

解決策が純粋にHQLでなくても、JVMホストからの時間が十分であれば、過去10分の日付を計算して引数として渡すだけです。データベースの時間が優先される場合は、別のクエリでクエリを実行し、それから10分を減算することで達成できます。