私は奇妙な問題に直面しています。ここをスタック オーバーフローに含めて検索しました。JPA およびカスタム クエリの場合は、パラメーターを指定する必要があります。14 を超えるフィールドがあるため、クエリ文字列がありますが、日付の問題に直面しています。私は常に IllegalStateException を取得しています
INFO: query STRING = SELECT t FROM Tickets t WHERE t.startdate > :startDate AND t.enddate < :endDate ORDER BY t.status DESC
WARNING: #{ticketController.search}: java.lang.IllegalStateException: Query argument startDate not found in the list of parameters provided during query execution.
私のクエリについては:
Query q = em.createQuery(query).setParameter("startDate", startDate, TemporalType.TIMESTAMP).setParameter("endDate", endDate, TemporalType.DATE);
パラメータが見つからないことはわかっていますが、setParameter にパラメータがあり、INFO 行に表示されているようにクエリにも設定されています。
何か案は?
前もって感謝します
編集:
INFO: query STRING = SELECT t FROM Tickets t WHERE t.startdate > ?1 AND t.enddate < ?2 ORDER BY t.status DESC
WARNING: #{ticketController.search}: java.lang.IllegalStateException: Query argument 1 not found in the list of parameters provided during query execution.
q = em.createQuery(query).setParameter(1, startDate, TemporalType.TIMESTAMP).setParameter(2, endDate, TemporalType.TIMESTAMP);
また、アドバイスどおり、使用している日付が java.util.Date であることを確認しました。そして、私がタイムスタンプとして持っているエンティティクラスで。しかし、まだこれを機能させることができず、どこで失敗しているのかわかりません。
すべてが正常であることを確認するために、クエリを強制的に文字列にすると、正しい例外が発生しました。
INFO: query STRING = SELECT t FROM Tickets t WHERE t.startdate > :startDate AND t.enddate < :endDate ORDER BY t.status DESC
WARNING: #{ticketController.search}: java.lang.IllegalArgumentException: You have attempted to set a value of type class java.lang.String for parameter startDate with expected type of class java.util.Date
しかし、もう一度、日付に変更すると失敗します:S この IllegalStateException の理由を確認しました:
そして、デバッグとjavadocから、次の情報を取得します: getResultList
IllegalStateException - Java Persistence クエリ言語の UPDATE または DELETE ステートメントで呼び出された場合。
私は更新も削除もしていません:/
編集 2: エンティティ関連部分の追加:
@Basic(optional = false)
@NotNull
@Column(name = "startdate")
@Temporal(TemporalType.TIMESTAMP)
private Date startdate;
@Column(name = "enddate")
@Temporal(TemporalType.TIMESTAMP)
private Date enddate;
データベース作成スクリプトの場合、列は次のように作成されます。
startdate timestamp with time zone NOT NULL,
endate timestamp with time zone,
「select * from tbl_tickets where startdate > '2012-02-01 00:00:00' and enddate < '2013-03-18 23:59:50'」のような通常の SQL クエリを実行すると、
望ましい結果が得られます。ネイティブクエリでできると思いますが、それは問題を回避し、この問題を修正しませんよね?
編集 3:すべてが適切に設定されていましたが、Bean の init が引数なしでクエリを再度呼び出していました (申し訳ありませんが、ご協力いただきありがとうございます。何が問題なのかを確認するのに役立ちました)