Hibernate条件限制:将两个属性作为简单表达式进行比较
我有一个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
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());