2

現在、HQL を使用してこのクエリを実行するのに問題があります。

String queryString = "SELECT o FROM Orders o WHERE o.orderMade >= DATE_SUB(NOW(), INTERVAL :fetchTime HOUR)";

これは、最後の ":fetchTime" 時間から最後の注文を取得します。

問題は、HQL を使用してこのパラメーターを設定する方法です。

やってみた

.em.createQuery(queryString).setParameter("fetchTime", fetchTime).getResultList();

ただし、休止状態エラーが発生します。

「?」も使ってみました。代わりに名前付きパラメーターですが、成功しません。

queryString に数値を書き込んでパラメーターを設定しなくても、このエラーが発生します。

unexpected token: 6

これは、fetchTime の代わりに使用した数字 6 を参照していることを知っています。

これを機能させる唯一の方法は、これを NativeQuery として使用することでしたが、これは切り離されたオブジェクトのリストを返すため、NamedQuery を使用したかったのです。

お時間をいただきありがとうございます!

4

2 に答える 2

4

時間関数はデータベース (MySQL、Oracle など) ごとに異なるため、SQL での時間計算は常に困難です。私がお勧めする最も簡単な解決策は、たとえば次のように Java で時間計算を行うことです。

long fetchTime = ....;  /* fetch time in hours */
String queryString = "FROM Orders o WHERE o.orderMade >= :orderTime";
Query query = session.createQuery(queryString);
Timestamp orderTime = new Timestamp(System.currentTimeMillis() - fetchTime * 60L * 60L * 1000L);
query.setTimestamp("orderTime", orderTime);
@SuppressWarnings("unchecked")
List<Orders> orders = query.list();

備考:60L * 60L * 1000L1時間です。長い計算を強制する L を忘れないでください。

そうすれば、HQL がすべてのデータベースで動作することを確認できます。

于 2012-09-21T06:58:36.047 に答える
1

It seems you have two choices or go native or use criteria

How to implement mysql date_sub() function in Hibernate 3.0

于 2012-09-21T11:53:59.093 に答える