我有一个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不是一个实用的选项。)
答案 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());