Преобразование даты в строку в условиях гибернации


Можно ли выполнить запрос, который проверяет строковое представление экземпляра Date. Например

Restrictions.like("dateField", "%12%") 

Для получения дат, которые имеют строку 12 в день или 12 в месяц или 12 в год, где "dateField" является экземпляром java.утиль.Дата Спасибо

2 3

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 зависит от того, какую базу данных вы используете.