8

HQL に精通している人 (私自身は初心者です) は、この質問に簡単に答えることができると確信しています。

私の Grails アプリケーションには、次のドメイン クラスがあります。

class Book {
  org.joda.time.DateTime releaseDate //I use the PersistentDateTime for persisting via Hibernate (that use a DATETIME type for MySQL DB)
}

HQL クエリで、リリース日が範囲に含まれる書籍を取得したいdate1..date2

たとえば、私は試しました:

DateTime date1, date2
... 
def queryStr = "select * from Book as b where b.releaseDate > $date1 and b.releaseDate < $date2" 
def res = Book.executeQuery(queryStr)

しかし、例外が...caused by: org.springframework.orm.hibernate3.HibernateQueryException: unexpected token: 発生しましたエラートークンは日付形式を指しています(たとえば2009-11-27T21:57:18.010+01:00、またはFri Nov 27 22:01:20 CET 2009

また、date1 を Date クラスに変換しようとしましたが、成功しませんでした

では、正しい HQL コードは何ですか? patternForStyle メソッドを使用して特定の形式 (どれ?) に変換する必要がありますか?それとも別のクリーンな方法がありますか?

ありがとう、

ファビアン。

4

3 に答える 3

7

私は Grails の専門家ではありませんが、Java では通常、パラメーターを作成date1してdate2クエリし、そのようにバインドします。

String hql = "select * from Book as b where b.releaseDate > :date1 and b.releaseDate < :date2";
session.createQuery(hql).setDate("date1", date1).setDate("date2", date2).list();

Grailsでも同様のことができると確信しています。そうでない場合は、日付をyyyyMMddhhmmss(スペースなしで) フォーマットし、一重引用符で囲みます。そうすれば、Hibernate はそれらを定数として扱い、MySQL は暗黙的にそれらを日付に変換します。

于 2009-12-04T23:10:00.037 に答える
3

ISO8601 日付形式を使用して日付を比較することもできます。

select * from Book as b 
where b.releaseDate > '2009-11-27T21:57:18.010+01:00' 
and b.releaseDate < '2010-11-27T21:57:18.010+01:00'

バックエンドとして MySql を使用してこれをテストしました。日付を文字列としてラップすることを忘れないでください。

于 2011-11-11T02:56:13.217 に答える