2012-03-01 25 views
3

有沒有一種方法可以通過使用HQL或/和Criteria將ID轉換爲整數的子字符串?通過使用Grails的HQL整數ID的子字符串排序

例如:

class Foo { 
    String id 
    String name 
} 

排序數據集看起來像:

90-1 David 
90-4 Mike 
101-1 Jack 
101-2 Peter 
105-1 Jon 
105-7 Jane 

隨着MySQL數據庫和本地SQL它會像做:

order by 
CAST(substring_index(id, '-', 1) AS UNSIGNED), 
CAST(substring(id, length(substring_index(id, '-', 1)) + 2) AS UNSIGNED) 

我試着用公式如建議,但沒有奏效,因爲UNSIGNED被視爲別名,生成的SQL有_this.UNSIGNED

Integer fooFirstID 
Integer fooSecondID 

static mapping = { 
    fooFirstID formula: "CAST(substring_index(id, '-', 1) AS UNSIGNED)" 
    fooSecondID formula: "CAST(substring(id, length(substring_index(id, '-', 1)) 
          + 2) AS UNSIGNED)" 
} 

我看到Hibernate支持子以及施放到Hibernate類型,但是找不到相當於SUBSTRING_INDEX的。

謝謝。

+0

我不確定,但它可能是這種類型的東西(東西作爲類型)專有(我猜)功能的mysql不支持冬眠的mysql方言。嘗試聯繫郵件列表,看看它是一個錯誤還是遺漏的功能。 – 2012-03-01 23:37:27

+0

它支持從我在這裏閱讀:http://docs.jboss.org/hibernate/core/3.3/reference/en/html/queryhql.html#queryhql-expressions – Micor 2012-03-02 00:50:18

+0

是有區別的簽名和無符號真正重要的這個案例?如果沒有,也許嘗試:'CAST(substring_index(id,' - ',1)AS整數)' – 2012-03-05 22:39:11

回答

1

您可以在批註屬性上使用@Formula批註和訂單,它工作正常。由TOTO秩序,塔塔

順便說一句,你可以考慮使用複合ID:

@Formula("CAST(substring_index(id, '-', 1) AS UNSIGNED)") 
public varType getToto() { 
    return toto; 
} 

@Formula("CAST(substring(id, length(substring_index(id, '-', 1)) + 2) AS UNSIGNED)") 
public varType getTata() { 
    return tata; 
} 

然後你在做HQL。

+0

由於UNSIGNED沒有被識別爲類型並被視爲別名,所以sql看起來像:因爲this_.UNSIGNED還不確定如果它的Hibernate或GORM在grails中添加該對象 – Micor 2012-03-01 22:42:29

+0

對不起,我不知道MySQL的UNSIGNED到給你正確的答案,但至少你可以嘗試刪除UNSIGNED,並嘗試命令蜇值來檢查我的解決方案的作品。字符串也可以訂購,「1」<「2」<「3」。 – 2012-03-01 23:33:19

+0

按字符串排序可行,但我可以在不使用公式的情況下完成相同的操作。按字符串排序的問題是「1」<「10」<「2」 – Micor 2012-03-01 23:51:51

0

您的問題是該類型不會被識別爲Hibernate類型。無論你做什麼,'As'都被視爲別名聯編程序。 這是奇怪的,因爲Hibernate文檔指出:

投(...爲...),其中第二個參數是一個Hibernate類型的名字,並提取(... ..從如果你正在使用H2

substring_index(id, '-', 1)::integer 

:)如果ANSI CAST()和提取物()是由底層數據庫

即使你正在使用MySQL支持的,你可以嘗試postgre投語法它是INT,而不是INTEGER

cast(substring_index(id, '-', 1) as INT) 

另請注意,您可以在Java中使用無符號概念的相關操作是二進制,十六進制或八進制轉換(對於前導位,顯然)。無論如何,它們總是將Integer視爲unsigned int,所以它沒關係。 如果你真的想要應用這個概念,你將不得不使用一個短的前導位,並將其轉換爲int,這會給你一個'真正無符號的'int。

+0

哦,並確保您也使用正確的方言,如前所述,只有底層數據庫支持,才能正常工作。 – Gepsens 2012-03-09 09:23:52

+0

不,MySQL不喜歡:: integer – Micor 2012-03-12 19:25:10

+0

這是一個postgre語法,它被Hibernate識別爲一個強制操作。我讀到它與底層實現無關。 – Gepsens 2012-03-13 11:03:24