有没有办法按照使用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。
感谢。
答案 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。