Как сделать запрос на месяц для даты с критериями Hibernate - PullRequest
4 голосов
/ 24 марта 2011

Мне нужно использовать критерии для запроса базы данных. У данных, которые я ищу, есть дата, скажем, «startDate», а у меня месяц, скажем, 0 за январь, мне нужно извлечь все данные, где startDate имеет месяц = ​​0; в SQL я бы использовал что-то вроде «где месяц (startDate) = 0», но я не знаю, как это сделать с критериями гибернации и если это вообще возможно. Вы можете мне помочь? Спасибо вам, ребята. Лука.

Ответы [ 2 ]

7 голосов
/ 24 марта 2011

С критериями, я думаю, вам придется написать свой собственный класс выражений.Нечто подобное должно работать (но не проверено):

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));
1 голос
/ 14 апреля 2015

Ответ выше не работал для меня, но с некоторыми изменениями он работает сейчас.

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)));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...