我想说,您有两个选择:映射或自定义 OrderBy 对象。
1)映射:如果Total
经常使用,您可以扩展您的实体映射并创建计算/只读属性(参见5.1.11. 属性):
<property name="total" formula="(sub1 + sub2)" insert="false" udpate="false" />
现在,我们可以轻松(在任何地方)将此值用于 Order by:
Criteria criteria = session.createCriteria(MyClass.class);
...
criteria.addOrder(Order.asc("total"));
2) 我们仍然在 OOP 世界中。该criteria.addOrder()
操作需要Order
对象实例。所以我们可以通过自定义的:'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));