Я пытаюсь создать именованный запрос для всех строковых аргументов. Вот как мой строковый метод был:
public Collection<Companypermcache> findExpiredPerms() {
String date = DateUtils.getSQLDate(DateUtils.getToday());
StringBuffer qbe = new StringBuffer("select cpc from Companypermcache cpc");
qbe.append(" where cpc.expire < '"+date+"'");
return super.findByQuery(qbe.toString());
}
Я преобразую это в именованный запрос, как показано ниже
String date = DateUtils.getSQLDate(DateUtils.getToday());
StringBuffer qbe = new StringBuffer("select cpc from Companypermcache cpc");
qbe.append(" where cpc.expire < :date");
return super.findByQuery(qbe.toString(),"date",date);
}
Но это генерирует
java.lang. ClassCastException: java.lang.String не может быть приведен к java.util.Date по адресу org.hibernate.type.descriptor.java.JdbcTimestampTypeDescriptor.unwrap (JdbcTimestampTypeDescriptor.java:24) в org.hibernate.type.TimeTordesDescript. .doBind (TimestampTypeDescriptor.java:48) в org.hibernate.type.descriptor.sql.BasicBinder.bind (BasicBinder.java:74) в org.hibernate.type.AbstractStandardBasicType.nullSafeSet (AbstractStandardBjasic) .25Thibernate.type. ...
Исключение.
Однако, если я обновлю именованный запрос, как показано ниже, у меня нетЭто исключение, и все выглядит хорошо.
String date = DateUtils.getSQLDate(DateUtils.getToday());
DateFormat simpleDateFormat=new SimpleDateFormat("yyyy-MM-dd");
Date edate = simpleDateFormat.parse(date);
StringBuffer qbe = new StringBuffer("select cpc from Companypermcache cpc");
qbe.append(" where cpc.expire < :date");
return super.findByQuery(qbe.toString(),"date",edate);
}
Однако я действительно не понял разницы и необходимости разбора. У меня есть много мест в моем проекте, где я использую getSQLDate (), поэтому я обеспокоенхочу ли я разобрать все эти даты? В дополнение к этому типу для редактирования в моей таблице есть DATETIME
Почему нам нужно анализировать дату, когда мы передаем дату в качестве аргумента для именованного запроса ???