2012-03-01 45 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