Hibernate Criteria限制:将两个属性比较为简单表达式

时间:2013-01-07 11:40:01

标签: hibernate criteria restrictions

我有一个Hibernate Criteria,以下是有效的:

criteria.add(Restrictions.eqProperty("x", "tbl.y"));

但我现在想要修改标准以检查一系列可能的值('x'和'y'都是整数),例如,这不起作用:

criteria.add(Restrictions.geProperty("x", "tbl.y - 1"));

我尝试过使用sqlRestriction,例如:

criteria.add(Restrictions.sqlRestriction("{alias}.x >= (tbl1_.y - 1)"));

但如何知道实际的别名('tbl1_')?

我是否必须使用子选择来完成这项工作? (现在使用HQL不是一个实用的选项。)

2 个答案:

答案 0 :(得分:5)

这就是我解决它的方法:

criteria.add(new PropertyExpression(null, null, null) {
    @Override
    public String toSqlString(Criteria criteria, CriteriaQuery criteriaQuery) throws HibernateException {
        String x = criteriaQuery.getColumnsUsingProjection(criteria, "x")[0];
        String y = criteriaQuery.getColumnsUsingProjection(criteria, "tbl.y")[0];
        StringBuilder result = new StringBuilder();
        result.append(x);
        result.append(">= (");
        result.append(y);
        result.append(" - 1)");
        return result.toString();
    }
});

遗憾的是,使用Hibernate Criteria API无法做到这一点(别名为连接表):

criteria.add(Restrictions.sqlRestriction("{alias}.x >= ({tbl}.y - 1)"));

答案 1 :(得分:1)

您可以为此实施自己的Criterion实施:

public static class YourCriterion implements Criterion{

    @Override
    public TypedValue[] getTypedValues(Criteria arg0, CriteriaQuery arg1) throws HibernateException {
        return new TypedValue[0];
    }

    @Override
    public String toSqlString(Criteria criteria, CriteriaQuery criteriaQuery) throws HibernateException {
        String x = criteriaQuery.getColumnsUsingProjection(criteria, "x")[0];
        String y = criteriaQuery.getColumnsUsingProjection(criteria, "tbl.y")[0];
         StringBuilder query = new StringBuilder();
         query.append(x);
         query.append(">= (");
         query.append(y);
         query.append(" - 1)");
         return query.toString();
    }

}
 criteria.add(new YourCriterion());

供参考:PropertyExpression