なぜ私はj​​ava.util.Dateをmysqlの日付と比較できないのですか?

私は奇妙な状況があります:

私は日の列がより大きいまたは私が(無関係なコードを取り除いた)送信する日付と等しいmySqlのDBテーブルから行を取得するためにjpa/hibernateを使用しています:

SELECT sp.* FROM spaceproduct sp where sp.enddate is null or sp.enddate >= :endDate)

私のコードでは、基本的には:

q.setParameter("endDate", new java.util.Date());

さて、私の問題は、DBの日付が同じ日付である場合です。すなわち、「今日」、それは取り上げられない。私はそれが何とかjava.util.dateの時間部分をデータベースの内容と比較しているからです(db値は "2011-10-28"のみですが、java.util Dateは2011-10-28T13:36です) :43.130 + 0200)

しかし、もし私がjava.sql.Date()に設定した日付パラメータを変更すると、それは動作します!

さて、私のmySql DB列がDateTimeではなく、これはバグではありません。 java.util.dateを送信しても、私のDB列が日付なので、日付部分だけを比較するべきではありませんか?

編集:私は、util - 日付を使用して、sql - 日付に変換しようとしました。実際には動作しません:

java.util.Date utilDate = new java.util.Date();
java.sql.Date sqlDate = new java.sql.Date(utilDate.getTime());
q.setParameter("endDate", sqlDate);

ですから、廃止予定の "year-month-date"コンストラクタを使用しない限り、私は見ることができるように、sql-dateの場合もtime部分を0に設定する必要があります

3
ねえ、入力いただきありがとうございます。上記の私の編集のコメントを見て、あなたが仲間と思うことを言う
追加された 著者 Mathias,
いいえ、バグではありません。 2011-10-28は> = 2011-10-28T13:36:43.130 + 0200ではありません。あなたの日付オブジェクトは2011-10-28T13:36:43.130 + 0200なので、失敗します。ただし、java.sql.Dateは日/月/年だけを格納するか、toString()を呼び出すときにそれを返します。したがって、2011-10-28と等しくなります。
追加された 著者 Thor84no,

2 答え

System.currentTimeMillis()を使用して、それを取得するために Date ユーティリティを作成することはできません。私はあなたの編集したコードが動作すると期待していますが、そうでない場合は、 System.currentTimeMillis()%24 * 60 *を実行するなどの方法で時間/分/秒/ 60 * 1000 (もちろん、それを定数に格納する方が良いですが、ポイントを取得します)。あるいは、あなたは単にJodaを使うことができます。

3
追加された
ええ、ありがとう、私はjodatimeのDateMidnightを使用して終わった...
追加された 著者 Mathias,

あなたは純粋に日付であり時刻情報を含んでいないので、java.sql.Dateを使うべきです。 java.util.Dateを使用する理由は、データベースまたはJDBCドライバが、DATEからTIMESTAMP(時間部分は00:00:00)に列の変換を拡大して、パラメータとの比較を行うためです。

1
追加された
マーク、あなたの考えに感謝します。しかし、sql-dateの主なビーフは、「日付 - 幅」のコンストラクタ、つまりyear-month-dateは廃止予定です。あなたは基本的に長いコンストラクタを使用する必要があります。そして、代わりにJodaTime "datemidnight"を使用することもできます。もっと良いアイデアはありますか?
追加された 著者 Mathias,
スタッカー、マーク、上記の私の編集を参照してください...
追加された 著者 Mathias,
btw。 java.sql.Dateはjava.util.Dateを継承します。
追加された 著者 stacker,
それで、Connector/Jドライバのバグだと思うのですが、実際にはjava.sql.DateをDATEに相当するものに変換するのはJDBCドライバの責任であることに気付きました。回避策として、java.sql.Date.toString()およびsetStringを使用することができます。
追加された 著者 Mark Rotteveel,