2011-10-14 46 views
3

是否可以执行检查Date实例的字符串表示形式的请求。例如将日期转换为休眠条件中的字符串

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

检索日期,要么有串12天或12个月或12年,其中“的DateField”是java.util.Date的实例 感谢

回答

6

我有同样的问题,这是我做的:

首先,我创建了自己的标准执行:

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),适用于具有to_char函数的postgresql。您可能需要稍微调整它以使用数据库引擎。

+0

PS:这是SQL注入安全的,不像下面的其他答案。 – Andre

+0

这不适合我。我可能会错过什么? –

+0

@MitalPritmani您正在使用哪个数据库?哪些区域设置?你得到什么错误? – Andre

1

像这样的事情


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

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

+0

如果您正在搜索用户提供的值,您将失去防止sql注入的休眠安全措施。你需要非常小心如何处理输入。而平均程序员的赔率不会涵盖所有的基础。您可以在准备好的HQL查询中使用强制转换函数将日期转换为字符串(如果db支持该字符串),并且您应该从sql注入安全。 – Andre