使用Grails在HQL中按ID作为整数的子字符串排序

时间:2012-03-01 19:36:28

标签: java hibernate grails hql

有没有办法按照使用HQL或/和Criteria转换为整数的ID的子字符串进行排序?

例如:

class Foo {
  String id
  String name
}

Sorted Dataset看起来像:

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。

感谢。

2 个答案:

答案 0 :(得分:1)

您可以在带注释的属性上使用@Formula注释和顺序,它可以正常工作。

@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中执行:按toto,tata命令

顺便说一句,您可以考虑使用复合ID。

答案 1 :(得分:0)

您的问题是该类型未被识别为Hibernate类型。无论你做什么,'as'都被视为别名绑定器。 这很奇怪,因为正如Hibernate文档所述:

  

cast(... as ...),其中第二个参数是Hibernate类型的名称,如果ANSI cast()和extract()受到支持,则提取(... from ...)基础数据库

即使您使用的是mysql,也可以尝试使用postgre强制语法:

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

如果您使用H2,则为INT,而不是INTEGER

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

另请注意,您可以在Java中使用无符号概念的相关操作是二进制,十六进制或八进制转换(显然对于前导位)。无论如何,它们始终将Integer视为unsigned int,因此无所谓。 如果你真的想要应用这个概念,你将不得不使用带有前导位的short,并将它转换为int,这将给你一个'真正无符号'的int。