Hibernate条件限制:将两个属性作为简单表达式进行比较

Hibernate条件限制:将两个属性作为简单表达式进行比较,hibernate,criteria,restrictions,Hibernate,Criteria,Restrictions,我有一个Hibernate标准,以下条件适用: criteria.add(Restrictions.eqProperty("x", "tbl.y")); 但是我现在想修改标准来检查一系列可能的值('x'和'y'都是整数),例如,这不起作用: criteria.add(Restrictions.geProperty("x", "tbl.y - 1")); 我尝试过使用sqlRestriction,例如: criteria.add(Restrictions.sqlRestriction("{al

我有一个Hibernate标准,以下条件适用:

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”)


我是否必须使用subselect来实现这一点?(使用HQL目前不是一个实用的选项。)

我就是这样解决的:

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无法做到这一点(别名为联接表):


您可以为此实现自己的标准实现:

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());

参考:

限制。设备属性(“x”、“y”)
:x和y应为属性名称。你的问题不清楚。你的目标是什么?哇。我确实努力把问题弄清楚了。不知道我错过了什么。我要的不是“where x=y”,而是“where x>=(y-1)”。同意。我也为此感到沮丧,所以最终打开了一个请求:。不过,在这段时间内,类似的方法也起了作用:)。谢谢你发布你的方法。
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());