Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/79.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 休眠条件条件A-B>C_Java_Sql_Hibernate_Criteria - Fatal编程技术网

Java 休眠条件条件A-B>C

Java 休眠条件条件A-B>C,java,sql,hibernate,criteria,Java,Sql,Hibernate,Criteria,如何定义hibernate标准以生成SQL: SELECT * FROM table WHERE columnA - columnB > anyInteger ?? 我知道有: Restrictions.sqlRestriction("column_a - column_b > "+int); 但它取决于列名,而不是类属性。有什么办法可以解决这个问题吗?我认为,如果您希望能够对其进行查询,就必须用列名来表示限制,因为计算必须在数据库端而不是Java端进行。但是,您可以将一个附加属

如何定义hibernate标准以生成SQL:

SELECT * FROM table WHERE columnA - columnB > anyInteger
?? 我知道有:

Restrictions.sqlRestriction("column_a - column_b > "+int);

但它取决于列名,而不是类属性。有什么办法可以解决这个问题吗?

我认为,如果您希望能够对其进行查询,就必须用列名来表示限制,因为计算必须在数据库端而不是Java端进行。但是,您可以将一个附加属性映射为,以将SQL封装在Hibernate映射定义中,而不必在每次查询时重复它:

@Formula("column_a - column_b")
private int difference;
然后,您可以将其作为

Restrictions.gt("difference", value)

好的,我找到了解决办法,而不是解决办法。我必须创建Criteria类的新实现。代码如下:

public class DifferenceCriterion implements Criterion{

    private static final long serialVersionUID = -8082375591482621375L;

    private String firstProperty;
    private String secondProperty;
    private int value;

    public DifferenceCriterion(String propertyA, String propertyB, int value) {
        this.firstProperty = propertyA;
        this.secondProperty = propertyB;
        this.value = value;
    }

    @Override
    public TypedValue[] getTypedValues(Criteria criteria, CriteriaQuery criteriaQuery) throws HibernateException {
        TypedValue tvFirst = criteriaQuery.getTypedValue(criteria, firstProperty, value);
        TypedValue tvSecond = criteriaQuery.getTypedValue(criteria, secondProperty, value);
        if(!tvFirst.equals(tvSecond)){
            throw new HibernateException("Properties typedValues are not the same!");
        }
        return new TypedValue[] {tvFirst};
    }

    @Override
    public String toSqlString(Criteria criteria, CriteriaQuery criteriaQuery) throws HibernateException {
        final String[] columnsA = criteriaQuery.getColumnsUsingProjection(criteria, this.firstProperty);
        final String[] columnsB = criteriaQuery.getColumnsUsingProjection(criteria, this.secondProperty);
        return columnsA[0] + " - "+columnsB[0] + " >  ?";
    }
}
并键入我的条件查询方法:

criteria.add(new DifferenceCriterion("columnA", "columnB", someInt));