hibernate带冒号查询
前言
转mysql过程中,sql语句中需要获取行号,而sqlserver有row_number() over 高级函数获取行号,但是MySQL并不支持行号功能,所以需要修改,但是网上获取MySQL的行号五花八门,这里以最简单的为例。
MySQL获取行号查询
给定一张表并插入测试数据
CREATE TABLE `student` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`NAME` varchar(255) DEFAULT NULL,
`age` int(11) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
INSERT INTO `student` VALUES (1, '小明1', 22);
INSERT INTO `student` VALUES (2, '小明2', 21);
INSERT INTO `student` VALUES (3, '小明3', 23);
INSERT INTO `student` VALUES (4, '小明4', 25);
INSERT INTO `student` VALUES (5, '小明5', 20);
INSERT INTO `student` VALUES (6, '小明6', 24);
INSERT INTO `student` VALUES (7, '小明7', 18);
INSERT INTO `student` VALUES (8, '小明8', 19);
INSERT INTO `student` VALUES (9, '小明9', 30);
现在根据年纪排行,并获取行号,sql如下:
SELECT
( @i := @i + 1 ) AS rowNum,
s.*
FROM
student AS s,
( SELECT @i := 0 ) AS t
ORDER BY
s.age DESC
这样就能获取到行号了。
填坑
当前负责的项目使用的是hibernate,而“:”是hibernate的一个占位符,作为预编译使用的,使用上面的sql会报错误
Space is not allowed after parameter prefix ':'
在网上 查找了资料,却发现这是hibernate3.X包之下的一个bug,(参照 id=41741)在hibernate4.X中已经修复。但是项目中不可能使用hibernate4.0。
于是,又搜索了解决方式:
需要对双冒号进行转义,在使用双反斜杠进行转义
所以改成如下方式:
SELECT
( @i \\:= @i + 1 ) AS rowNum,
s.*
FROM
student AS s,
( SELECT @i \\:= 0 ) AS t
ORDER BY
s.age DESC
但是...还是报错,这并没有效果,不知道是不是版本的问题
继续翻墙搜索,终于发现一个解决方案:
Another solution for those of us who can't make the jump to Hibernate 4.1.3. Simply use /'/:=/'/ inside the query. Hibernate code treats everything between ' as a string (ignores it). MySQL on the other hand will ignore everything inside a blockquote and will evaluate the whole expression to an assignement operator. I know it's quick and dirty, but it get's the job done without stored procedures, interceptors etc.
所以将上面的sql改成
SELECT
( @i /*'*/:=/*'*/ @i + 1 ) AS rowNum,
s.*
FROM
student AS s,
( SELECT @i /*'*/:=/*'*/ 0 ) AS t
ORDER BY
s.age DESC
终于解决了。
附上stackoverflow的链接