在Hibernate Criteria中将date转换为字符串

时间:2011-10-14 09:21:04

标签: java hibernate date criteria sql-like

是否可以执行检查Date实例的字符串表示形式的请求。例如

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

检索日期为String 12或12月或12年的日期,其中“dateField”是java.util.Date的实例 感谢

2 个答案:

答案 0 :(得分:7)

我遇到了同样的问题,这就是我所做的:

首先,我创建了自己的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放在一起时,我只是使用它:

criteria.add(new DateLikeExpression("dateColumnName", "26/11%"));

就是这样。请注意,此实现 依赖于区域设置(在本例中为pt_BR),适用于具有to_char函数的postgresql。您可能需要稍微调整一下才能使用数据库引擎。

答案 1 :(得分:1)

像这样的东西


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

sqlRestriction中的部分取决于您使用的数据库。