Преобразование даты в строку в условиях гибернации
Можно ли выполнить запрос, который проверяет строковое представление экземпляра Date. Например
Restrictions.like("dateField", "%12%")
Для получения дат, которые имеют строку 12 в день или 12 в месяц или 12 в год, где "dateField" является экземпляром java.утиль.Дата Спасибо
2 ответа:
У меня была та же проблема, и вот что я сделал:
Во-первых, я создал свою собственную реализацию критерия:
public class DateLikeExpression implements Criterion { private static final long serialVersionUID = 1L; private String propertyName; private String value; public DateLikeExpression(String propertyName, String value) { this.propertyName = propertyName; this.value = value; } public String toSqlString(Criteria criteria, CriteriaQuery criteriaQuery) throws HibernateException { String[] columns = criteriaQuery.getColumnsUsingProjection(criteria, propertyName); if (columns.length != 1) { throw new HibernateException("Like may only be used with single-column properties"); } return "to_char(" + columns[0] + ", 'DD/MM/YYYY HH24:MI') like ?"; } public TypedValue[] getTypedValues(Criteria criteria, CriteriaQuery criteriaQuery) throws HibernateException { return new TypedValue[] { new TypedValue(new org.hibernate.type.StringType(), MatchMode.START.toMatchString(value.toLowerCase()), EntityMode.POJO) }; } }
Тогда я просто использую его, когда складываю критерии вместе:
criteria.add(new DateLikeExpression("dateColumnName", "26/11%"));
И это все. Обратите внимание, что эта реализация зависит от локали (в данном случае pt_BR) и работает для postgresql, который имеет функцию to_char. Возможно, вам придется немного изменить его, чтобы работать с вашим ядром базы данных.
Что-то вроде этого
Restrictions.sqlRestriction("month(dateField) = 12"); Restrictions.sqlRestriction("right(year(dateField),2) = 12");
Часть в пределахsqlrestrication зависит от того, какую базу данных вы используете.