アプリを JPA1.0/Hibernate 3.3.2.GA から JPA2.0/Hibernate 3.6.10.FINAL に移行したところ、既存の JPA クエリの 1 つが機能しなくなりました。
クエリは、次のような永続フィールドの値に対する制約を使用します。
private java.sql.Timestamp birthday;
クエリは次のようになります。
String qlString = "SELECT u FROM User u WHERE u.birthday BETWEEN :minDate AND :maxDate";
Query query = eMgrTwo.createQuery(qlString);
Calendar minDateCalendar = Calendar.getInstance();
minDateCalendar.set(1970, 4, 29);
Calendar maxDateCalendar = Calendar.getInstance();
maxDateCalendar.set(1970, 6, 29);
query.setParameter("minDate", minDateCalendar, TemporalType.TIMESTAMP);
query.setParameter("maxDate", maxDateCalendar, TemporalType.TIMESTAMP);
List results = query.getResultList();
jpa と hibernate の古いバージョンでも、これは機能します。それに対して、新しいバージョンでは、
Exception in thread "main" java.lang.IllegalArgumentException: Parameter value [java.util.GregorianCalendar SNIP SNIP] did not match expected type [java.util.Date]
カレンダーの代わりに日付を使用するようにコードを変更すると、機能します。前のコードが機能した理由を知りたいだけですか? APIは変更されましたか?または、以前は文書化されていない機能を使用していましたか?