如何使用Hibernate条件查询月份中的日期

如何使用Hibernate条件查询月份中的日期,hibernate,criteria,Hibernate,Criteria,我需要使用条件来查询数据库。 我正在搜索的数据有一个日期,比如'startDate',我有一个月份,比如说1月份为0,我需要提取startDate的月份=0的所有数据;在sql中,我会使用类似于“where month(startDate)=0”的内容,但我不知道如何使用hibernate条件以及是否可能这样做。 你能帮助我吗? 谢谢你们。 Luca。根据标准,我认为您必须编写自己的表达式类。类似的方法应该可以工作(但未经测试): 然后,您可以在条件中使用此表达式: criteria.add(n

我需要使用条件来查询数据库。 我正在搜索的数据有一个日期,比如'startDate',我有一个月份,比如说1月份为0,我需要提取startDate的月份=0的所有数据;在sql中,我会使用类似于“where month(startDate)=0”的内容,但我不知道如何使用hibernate条件以及是否可能这样做。 你能帮助我吗? 谢谢你们。
Luca。

根据标准,我认为您必须编写自己的表达式类。类似的方法应该可以工作(但未经测试):

然后,您可以在条件中使用此表达式:

criteria.add(new MonthEqExpression("startDate", 0));
criteria.add(new MonthEqExpression("startDate", new Long(1)));

上面的答案对我不起作用,但经过一些修改,它现在起作用了

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", 0));
criteria.add(new MonthEqExpression("startDate", new Long(1)));

它工作得很好,谢谢,我不可能想出这样的解决方案,我感到很痛苦。@Luca Paoli:Hibernate是开源的。我只是查看了hibernate代码中现有表达式的代码。