我會說,你有兩個選擇:映射或自定義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。 –