这是查询
SELECT id, name, sub1, sub2, sub1 + sub2 AS total
FROM mytable
ORDER BY sub1 + sub2 ASC
我在这里要做的是,我将添加sub1和sub2,结果将命名为TOTAL,我将使用TOTAL for Order By。到目前为止,这是我如何提出但它没有得到适当的结果
sess().createSQLQuery("SELECT *, SUB1+ SUB2 AS TOTAL FROM TRACKS order by TOTAL ").addEntity(Student.class).list();
什么是hibernate或Query Criteria等同于我想要做的事情?
答案 0 :(得分:1)
在JPQL中没有这样的操作,但你可以做的是做一个本机查询,如下所示:
"SELECT * FROM TRACKS order by SUB1+ SUB2"
并制作一个吸气剂:
public Double getTotal(){ //Replace Double for the data type you use
return sub1 + sub2;
}
这样您可以根据需要订购查询。
这是你想要做的吗?我不确定我是否理解你的问题
答案 1 :(得分:0)
我想说,你有两个选择:映射或自定义OrderBy对象。
1)映射:如果经常使用Total
,您可以扩展实体映射并创建计算/读取属性(见5.1.11. Property):
<property name="total" formula="(sub1 + sub2)" insert="false" udpate="false" />
现在,我们可以轻松地(以及任何地方)使用此值作为Order:
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));