我刚刚将一个应用程序从 JPA1.0/Hibernate 3.3.2.GA 迁移到 JPA2.0/Hibernate 3.6.10.FINAL 并且我现有的一个 JPA 查询不再有效。
该查询对持久字段的值使用约束,如下所示:
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有变化吗?还是我们之前使用了未记录的功能?