3

我有一个休眠标准,以下适用:

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 不是一个实用的选择。)

4

2 回答 2

6

这就是我解决它的方法:

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)"));
于 2013-01-07T14:11:47.127 回答
2

您可以为此实现自己的 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

于 2018-01-12T10:58:28.400 回答