Как сделать запрос на месяц для даты с критериями Hibernate
Мне нужно использовать критерии для запроса базы данных. У данных, которые я ищу, есть дата, скажем, "startDate", и у меня есть месяц, скажем, 0 за январь, мне нужно извлечь все данные, где startDate имеет месяц = 0; в SQL я бы использовал что-то вроде "где месяц (startDate) = 0", но я не знаю, как это сделать с критериями гибернации и если это вообще возможно. Вы можете мне помочь? Спасибо вам, ребята. Лука.
2 ответа
С критериями, я думаю, вам придется написать свой собственный класс выражений. Примерно так должно работать (не проверено, хотя):
public class MonthEqExpression implements Criterion {
private final String propertyName;
private final int month;
public MonthEqExpression(String propertyName, int month) {
this.propertyName = propertyName;
this.month = month;
}
@Override
public String toSqlString(Criteria criteria, CriteriaQuery criteriaQuery)
throws HibernateException {
String[] columns = criteriaQuery.findColumns(propertyName, criteria);
if (columns.length!=1) {
throw new HibernateException("monthEq may only be used with single-column properties");
}
return "month(" + columns[0] + ") = ?";
}
@Override
public TypedValue[] getTypedValues(Criteria criteria, CriteriaQuery criteriaQuery) throws HibernateException {
return new TypedValue[] {new TypedValue(IntegerType.INSTANCE, month, EntityMode.POJO)};
}
@Override
public String toString() {
return "month(" + propertyName + ") = " + month;
}
}
И затем, вы можете использовать это выражение в критерии:
criteria.add(new MonthEqExpression("startDate", 0));
Ответ выше не работал для меня, но с некоторыми изменениями он работает сейчас.
public class MonthEqExpression implements Criterion {
private final String propertyName;
private final Long month;
public MonthEqExpression(String propertyName, Long month) {
this.propertyName = propertyName;
this.month = month;
}
@Override
public String toSqlString(Criteria criteria, CriteriaQuery criteriaQuery) throws HibernateException {
String[] columns = criteriaQuery.getColumns(propertyName, criteria);
if (columns.length != 1) {
throw new HibernateException("monthEq may only be used with single-column properties");
}
return "extract(month from " + columns[0] + ") = ?";
}
@Override
public TypedValue[] getTypedValues(Criteria criteria, CriteriaQuery criteriaQuery) throws HibernateException {
return new TypedValue[] {new TypedValue(criteriaQuery.getIdentifierType(criteria), month, EntityMode.POJO)};
}
@Override
public String toString() {
return "extract(month from " + propertyName + ") = " + month;
}
}
И затем, вы можете использовать это выражение в критерии:
criteria.add(new MonthEqExpression("startDate", new Long(1)));