web-dev-qa-db-ja.com

HQLの日付の比較

次のクエリがあります。

    StringBuilder sb = new StringBuilder("select e from Event e");
    sb.append(" where e.user = :user and e.activated = true and e.startDate <= :date and uc.endDate >= :date");
    Query query = this.getEntityManager().createQuery(sb.toString());
    query.setParameter("user", user);
    query.setParameter("date", date);

Dateが標準の場合Java dateオブジェクトとstartDate、endDateは時刻のないPostgresql日付です(たとえば、データベースでは「2014-04-03」のようになります)

しかし、指定された日付パラメーターがstartDate列と同じ日である場合、一致するものが見つからないことがわかりました。 '<='の '='がこれに対処すると思いましたか?

1つは完全なタイムスタンプで、もう1つは単なる日付であるため、これが発生していると思いますか?私はすでに他の同様の質問からの提案を試しました...

-SimpleDateFormatを使用して日付をyyyy-MM-ddパターンに変換し、次にDATE()を使用してHQLにキャストします

-パラメータとして設定する前に、カレンダーを使用して時間コンポーネントを削除する

-day(e.startDate)<= day(date)AND month(e.startDate)= month(date)などを使用します。

しかし、どれもうまくいきませんでした。だから私の質問は、なぜこの日付比較が機能しないのか、そして/またはパラメータを日付に正しくキャストするにはどうすればよいですか?

PostgreSQL 9.0 | JPA |休止状態3.6

ありがとう!

4
DaveB

Query.setDate()Query.setTimestamp() メソッドを確認し、Query.setParameter()の代わりに正しいメソッドを使用してください。

6
Zsolt Süli

以下のようなもの:-

Query q = em.createQuery("select o from LoadFileHistory o where o.finishDate > :today ");
q.setParameter("today",todaysDateObject,TemporalType.DATE);
q.getResultList();


select o from Operation o
where o.merchantId = :merchantId
and o.captureLimitDate < :maxDateTime
query.setParameter("maxDateTime", maxDateTime, TemporalType.TIMESTAMP);
2
Ankur Singhal