2013-09-01 114 views
0

這是查詢什麼是此查詢的休眠等效?(添加兩列)

SELECT id, name, sub1, sub2, sub1 + sub2 AS total 
FROM mytable 
ORDER BY sub1 + sub2 ASC 

我想在這裏做的是,我會添加SUB1和SUB2,結果將被命名爲TOTAL ,我將使用TOTAL作爲Order By。到目前爲止,這是我怎麼想出來的,但它沒有正確渲染reults

sess().createSQLQuery("SELECT *, SUB1+ SUB2 AS TOTAL FROM TRACKS order by TOTAL ").addEntity(Student.class).list(); 

什麼是什麼,我試圖做休眠或查詢條件相同呢?

+0

假設mytable是一個實體的類名,這是有效的HQL。 –

回答

1

存在JPQL沒有這樣的操作,但你可以做的是做一個本地查詢,如下所示:

"SELECT * FROM TRACKS order by SUB1+ SUB2" 

而作出這樣一個getter:

public Double getTotal(){ //Replace Double for the data type you use 
    return sub1 + sub2; 
} 

這樣,你可以命令你想要的查詢。

這是你想要做什麼?我不確定你是否理解得很好你的問題

0

我會說,你有兩個選擇:映射或自定義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語句,並直接注入到這一點OR​​DER 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));