2012-07-18 68 views

回答

14

儘管話題很老,可能問題解決了,我會解決。也許這對未來會有幫助。

criteria.addOrder(new org.hibernate.criterion.Order("anystring", true) { 
      @Override 
      public String toSqlString(Criteria criteria, CriteriaQuery criteriaQuery) throws HibernateException { 
       return "cast(id as int)"; 
      } 
     }); 
+1

如果您不想指定升序或降序,則此解決方案有效,因爲在原始toSqlString方法中使用了第二個參數。如果你重寫它,你必須在你自己的字符串末尾添加asc或desc。 – KarolR 2016-07-29 05:56:15

+1

KarolR,這就是爲什麼該方法被稱爲toSqlString。您可以按自己的意願編寫自己的訂單,但應指定整個訂單字符串。還有一個 - 總是有順序的方向,默認情況下使用「asc」,因此「cast(id as int)」實際上是「cast(id as int)asc」,但是可以跳過它。您可以指定複雜的順序,hibernate應該如何決定放置方向的位置,它被指定爲參數? – yorlin 2016-07-29 06:12:47

+0

這確實是非常有幫助的,你只是花了很多時間來重新將我的標準代碼重構爲SQL只是爲了訂購問題。爲您的評論和答案+1。 – nihirus 2016-11-03 17:00:58

3

如果該列包含整數值,則最佳解決方案是將其映射爲整數而不是字符串。

如果由於難以理解的原因,這是不可能的,您可以在實體中添加一個用@Formula("cast(id) as number")註解的整數字段,並在該字段中排序。

+0

由於泛型調用和一些帶有字符串標識符的表,決定將所有內容都轉換爲字符串。無論如何,由於maven構建(在hibernate3-maven-plugin中)的錯誤異常,我無法使用公式註釋,所以我無法測試它,我只是將這個問題留在待命狀態。 Tks – spnbldk 2012-07-18 16:25:39

+1

它應該是'@Formula(「cast(id爲NUMBER(10,0))」)' – jtomaszk 2013-07-08 08:51:30