【问题标题】:Usage of mysql variables in query in Spring Jdbc Template gives error在 Spring Jdbc 模板的查询中使用 mysql 变量会出错
【发布时间】:2014-03-03 08:20:12
【问题描述】:

我的要求是在每个科目中挑选出前 2 名的学生。这是我的表格和我用来获取表格的查询。

CREATE TABLE `students` (               
`student` varchar(10) DEFAULT NULL,   
`subject` varchar(10) DEFAULT NULL,   
`marks` int(10) DEFAULT NULL          
);

INSERT INTO students VALUES
('Deepak', 'Maths', 100),
('Neha', 'Maths', 90),
('Jyoti', 'Maths', 80),
('Ashwini', 'Maths', 70),
('Amit', 'Maths', 30),
('Sandeep', 'Maths', 95),
('Cinni', 'Maths', 86),
('Anand', 'Maths', 75),
('Deepak', 'Science', 100),
('Neha', 'Science', 90),
('Jyoti', 'Science', 80),
('Ashwini', 'Science', 70),
('Amit', 'Science', 30),
('Sandeep', 'Science', 95),
('Cinni', 'Science', 86),
('Anand', 'Science', 75),
('Deepak', 'History', 100),
('Neha', 'History', 90),
('Jyoti', 'History', 80),
('Ashwini', 'History', 70),
('Amit', 'History', 30),
('Sandeep', 'History', 95),
('Cinni', 'History', 86),
('Anand', 'History', 75);



mysql> SELECT * FROM students
+---------+---------+-------+
| student | subject | marks |
+---------+---------+-------+
| Deepak  | Maths   |   100 |
| Neha    | Maths   |    90 |
| Jyoti   | Maths   |    80 |
| Ashwini | Maths   |    70 |
| Amit    | Maths   |    30 |
| Sandeep | Maths   |    95 |
| Cinni   | Maths   |    86 |
| Anand   | Maths   |    75 |
| Deepak  | Science |   100 |
| Neha    | Science |    90 |
| Jyoti   | Science |    80 |
| Ashwini | Science |    70 |
| Amit    | Science |    30 |
| Sandeep | Science |    95 |
| Cinni   | Science |    86 |
| Anand   | Science |    75 |
| Deepak  | History |   100 |
| Neha    | History |    90 |
| Jyoti   | History |    80 |
| Ashwini | History |    70 |
| Amit    | History |    30 |
| Sandeep | History |    95 |
| Cinni   | History |    86 |
| Anand   | History |    75 |
+---------+---------+-------+
24 rows in set (0.00 sec)

mysql> Set character_set_connection=latin1;
Query OK, 0 rows affected (0.00 sec)

mysql> Set character_set_results=latin1;
Query OK, 0 rows affected (0.00 sec)

mysql> Set character_set_client=latin1;
Query OK, 0 rows affected (0.00 sec)

mysql> SET @rowcnt := 0; SET @grp := ''; SELECT d.* FROM (
    ->     SELECT
    ->         cs.*,
    ->         @rowcnt := IF(@grp != cs.subject, 1, @rowcnt + 1) AS rowcnt,
    ->         @grp := cs.subject
    ->     FROM (
    ->         SELECT * FROM students ORDER BY subject, marks DESC
    ->     ) cs
    -> ) d
    -> WHERE d.rowcnt < 3;
Query OK, 0 rows affected (0.00 sec)
Query OK, 0 rows affected (0.00 sec)

+---------+---------+-------+--------+--------------------+
| student | subject | marks | rowcnt | @grp := cs.subject |
+---------+---------+-------+--------+--------------------+
| Deepak  | History |   100 |      1 | History            |
| Sandeep | History |    95 |      2 | History            |
| Deepak  | Maths   |   100 |      1 | Maths              |
| Sandeep | Maths   |    95 |      2 | Maths              |
| Deepak  | Science |   100 |      1 | Science            |
| Sandeep | Science |    95 |      2 | Science            |
+---------+---------+-------+--------+--------------------+
6 rows in set (0.00 sec)

mysql>

现在,从控制台一切正常,但是当我在 Spring JdbcTemplate 中执行相同的查询时,它给了我错误。

jdbcTemplate.query(query, new StudentRowMapper());

查询打印到以下内容,这与我在命令行上使用的查询完全相同。

SET @rowcnt := 0; SET @grp := ''; SELECT d.* FROM ( SELECT cs.*, @rowcnt := IF(@grp != cs.subject, 1, @rowcnt + 1) AS rowcnt, @grp := cs.subject FROM ( SELECT * FROM students ORDER BY subject, marks DESC ) cs ) d WHERE d.rowcnt < 3;

这是我在运行时遇到的错误:

com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'SET @grp := ''; SELECT d.* FROM ( SELECT cs.*, ' at line 1
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source)
at java.lang.reflect.Constructor.newInstance(Unknown Source)
at com.mysql.jdbc.Util.handleNewInstance(Util.java:411)
at com.mysql.jdbc.Util.getInstance(Util.java:386)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1054)
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:4190)
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:4122)
at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2570)
at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2731)
at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2818)
at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:2157)
at com.mysql.jdbc.PreparedStatement.executeQuery(PreparedStatement.java:2324)
at org.springframework.jdbc.core.JdbcTemplate$1.doInPreparedStatement(JdbcTemplate.java:646)
at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:589)
at org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:639)
at org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:668)
at org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:676)
at org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:716)

【问题讨论】:

    标签: java mysql sql spring jdbc


    【解决方案1】:

    只需像这样将变量放在选择中

    SELECT d.* 
    FROM 
        ( SELECT cs.*, @rowcnt := IF(@grp != cs.subject, 1, @rowcnt + 1) AS rowcnt, @grp := cs.subject 
         FROM ( SELECT * FROM (select @rowcnt :=0, @grp :='') a,students ORDER BY subject, marks DESC ) cs ) d 
    WHERE d.rowcnt < 3;
    

    【讨论】:

    • 这并没有显示任何错误,但也没有返回任何数据。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-04
    • 1970-01-01
    • 1970-01-01
    • 2012-05-27
    相关资源
    最近更新 更多