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的链接

解决方法1

你可能感兴趣的:(hibernate带冒号查询)