Конвертировать дату в строку в Hibernate Criteria - PullRequest
3 голосов
/ 14 октября 2011

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

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

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

Ответы [ 2 ]

7 голосов
/ 29 мая 2012

У меня была та же проблема, и вот что я сделал:

Сначала я создал свою собственную реализацию Criterion:

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.Возможно, вам придется немного его настроить, чтобы работать с ядром базы данных.

1 голос
/ 14 октября 2011

Примерно так


Restrictions.sqlRestriction("month(dateField) = 12");
Restrictions.sqlRestriction("right(year(dateField),2) = 12");

Часть в sqlRestriction зависит от используемой базы данных.

...