我会说,你有两个选择:映射或自定义OrderBy对象。
1)映射:如果Total
将被经常使用,可以延长你的实体映射,并创建计算/只读财产(SEEE 5.1.11. Property):
<property name="total" formula="(sub1 + sub2)" insert="false" udpate="false" />
现在,我们可以使用这个值轻松(和任何地方)订购:
Criteria criteria = session.createCriteria(MyClass.class);
...
criteria.addOrder(Order.asc("total"));
2)我们仍然在OOP世界。 criteria.addOrder()
操作期望Order
对象实例。所以我们可以传递一个Custom:'MyOrder'。在我们的例子中,它可能是对象接受任何有效 SQL语句,并直接注入到这一点ORDER BY:
public class MyOrder extends Order {
public MyOrder(String propertyName, boolean ascending) {
super(propertyName, ascending);
}
public String toSqlString(Criteria criteria, CriteriaQuery criteriaQuery) {
StringBuilder fragment = new StringBuilder();
fragment.append(propertyName);
fragment.append(ascending ? " asc" : " desc");
return fragment.toString();
}
}
现在,我们可以注入任何(有效)SQL脚本到ORDER BY这样:
Criteria criteria = session.createCriteria(MyClass.class);
...
criteria.addOrder(new MyOrder("(sub1 + sub2)", true));
假设mytable是一个实体的类名,这是有效的HQL。 –