1

5日より古いものを取得するクエリを実行する必要があります。(カスタム日付)HQLを確認しましたが、永続的であるため、ここのようにsetTimestampにアクセスできません。

String hqlQuery;
Calendar minDate = Calendar.getInstance();
minDate.add(Calendar.DATE, -days);
hqlQuery = "select n from notifications where n.app_id=:app and ((n.sent_date<=:minDate) OR (n.sent_date is null)) and n.handled='N'";

私が試した方法です...甘いヘルパー、事前に感謝します:-)

編集:それで私は私の方法を変更しましたそれは今このように見えます:

public static List<Notification> findOlderThen(EntityManager em, Long app, int days) {
    String hqlQuery;
    Calendar minDate = Calendar.getInstance();
    minDate.add(Calendar.DATE, -days);
    hqlQuery = "select n from notifications where n.app_id=:app and ((n.sent_date<=:minDate) OR (n.sent_date is null)) and n.handled='N'";
    System.out.println(hqlQuery);
    return em.createQuery(hqlQuery).setParameter("app", app).setParameter("minDate",minDate.getTime()).getResultList();
}

しかし、それはこのエラーを与えます:

Caused by: java.lang.IllegalArgumentException: An exception occurred while creating a query in EntityManager: 
Exception Description: Syntax error parsing the query [select n from notifications where n.app_id=:app and ((n.sent_date<=:minDate) OR (n.sent_date is null)) and n.handled='N'], line 1, column 28: syntax error at [where].
Internal Exception: UnwantedTokenException(found=where, expected 80)
4

2 に答える 2

3
SessionFactory sf = // get your session factory
Query q = sf.getCurrentSession()
        .createQuery(hqlQuery);
q.setParameter("minDate",minDate.getTime())
 .setParameter("app", appId)
 .list();

send_dateのタイプがNotificationsモデルクラスのDateであると仮定して、日付パラメーターを設定する方法になります。また、クエリのこの部分でselect n from notificationsは、通知がクラスの実際の名前であることを確認してください。ケースが重要です!おそらくそうあるべきselect n from Notifications nです。

アップデート:

クラスのエイリアスを宣言する必要があります。

于 2012-05-29T12:51:00.760 に答える
0

私が間違っていなければ、クエリに日付を追加するときに、次のようなことをすることになっているのではないでしょうか。

hqlQuery = "select n from notifications where n.app_id=:app and ((n.sent_date<=':minDate') OR (n.sent_date is null)) and n.handled='N'";

minDate変数の周りの'に注意してください

于 2012-05-29T12:49:58.490 に答える