3

私は奇妙な問題に直面しています。ここをスタック オーバーフローに含めて検索しました。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 が引数なしでクエリを再度呼び出していました (申し訳ありませんが、ご協力いただきありがとうございます。何が問題なのかを確認するのに役立ちました)

4

4 に答える 4

6

両方のjavadoc

setParameter(String name, java.util.Date value, TemporalType temporalType)`
setParameter(String name, java.util.Calendar value, TemporalType temporalType)`

状態:

例外: IllegalArgumentException- パラメータ名がクエリのパラメータに対応していない場合、または値引数の型が正しくない場合

完全なコードを提供していないため、次のことを確認してください。

  • Java 値startDateの型はjava.util.Dateorjava.util.Calendarです。

  • SQL 列startDateに有効な SQL 日付型がありますTIMESTAMP

于 2013-03-18T04:06:07.097 に答える
1

: (コロン) と startDate の間にはスペースが必要だと思います。:startDateを単一の単語と見なしている可能性があります。これを一度お試しください

于 2013-03-18T03:33:55.473 に答える
1

試す

String query = "SELECT t FROM Tickets t  WHERE t.startdate > ?1 AND t.enddate < ?2 ORDER BY t.status DESC";

Query q = em.createQuery(query).setParameter(1, startDate, TemporalType.TIMESTAMP).setParameter(2, endDate, TemporalType.DATE);

于 2013-03-18T03:37:15.320 に答える
0
Query q = em.createQuery(query).setParameter("startDate", startDate, TemporalType.TIMESTAMP).setParameter("endDate", endDate, TemporalType.DATE);

setParameter使用しているを注意深く見ると、これにsetParameterは が必要であるPositional Parameterことが示されていますが、クエリを見ると、 を使用しているようですNamed Parameter

したがって、IllegalStateException. クエリを providePositional Parametersに変更するか、入力としてsetParameter提供するように変更しますNamed Parameters

これはPositional Parameter、クエリで指定する方法です。

String query = "SELECT t FROM Tickets t  WHERE t.startdate > ?1 AND t.enddate < ?2 ORDER BY t.status DESC";
....
Query q = em.createQuery(query).setParameter(1, startDate, TemporalType.TIMESTAMP).setParameter(2, endDate, TemporalType.DATE);
于 2013-03-18T03:36:16.227 に答える