Spring JdbcDaoSupport

时间:2014-06-11 09:32:15

标签: java mysql spring

请帮助我!我遇到了麻烦。 我接下来是SQL查询

SET @sql = '';

SELECT
  GROUP_CONCAT(DISTINCT
    CONCAT( 
      'getInterviewsNumber(\'', name, 
'\', vtable.position)',
' AS \'',
      name, '\''
    ) separator ','
  ) INTO @sql
FROM interview_portal.departments;


SET @sql = CONCAT('SELECT distinct vtable.position,  ',@sql, ' FROM inter_count as vtable');

PREPARE stmt FROM @sql;
EXECUTE stmt;

DEALLOCATE PREPARE stmt;

在MySQL工作台中运行良好。但是如何使用Spring JdbcDaoSupport执行此查询并获取ResultSet? 我尝试了很多变种,但是我得到了MySQLSyntaxErrorException。

感谢您的帮助!

这是我的例外

SEVERE: Servlet.service() for servlet [generalDispatcher] in context with path [/InterviewPortal] threw exception [Request processing failed; nested exception is org.springframework.jdbc.BadSqlGrammarException: StatementCallback; bad SQL grammar [SET @sql = ''; SELECT GROUP_CONCAT( DISTINCT CONCAT ( 'getInterviewsNumber(\'', name, '\', vtable.position)',' AS \'', name, '\'')  separator ',') INTO @sql FROM interview_portal.departments; SET @sql = CONCAT('SELECT distinct vtable.position, ', @sql, ' FROM inter_count as vtable'); PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;]; nested exception is 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 'SELECT GROUP_CONCAT( DISTINCT CONCAT ( 'getInterviewsNumber(\'', name, '\', vtab' at line 1] with root cause
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 'SELECT GROUP_CONCAT( DISTINCT CONCAT ( 'getInterviewsNumber(\'', name, '\', vtab' at line 1
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:526)

这是我的代码:

String sql = "SET @sql = '';" +
                " SELECT" +
                " GROUP_CONCAT(" +
                " DISTINCT CONCAT ( " +
                "'getInterviewsNumber(\\'', name, " +
                "'\\', vtable.position)'," +
                "' AS \\'', name, '\\'') " +
                " separator ',') INTO @sql " +
                "FROM interview_portal.departments;" +
                " SET @sql = CONCAT('SELECT distinct vtable.position, '," +
                " @sql, ' FROM inter_count as vtable');" +
                " PREPARE stmt FROM @sql;" +
                " EXECUTE stmt;" +
                " DEALLOCATE PREPARE stmt;" ;
        getJdbcTemplate().batchUpdate(temp);
                //"ORDER BY " + query.getSortType().getColumnName() + ((query.isDescendingSort()) ? " DESC" : " ASC;");
        Object[] args = new Object[0];
        return getJdbcTemplate().query(sql, args,
                positionItemMapper);

2 个答案:

答案 0 :(得分:0)

首先,您必须使用SQL代码创建存储过程,请参阅MySQL documentation

然后,您将能够使用JDBC模板调用它:

jdbcTemplate.update("call PROC_NAME (?, ?)", param1, param2);

Spring documentation了解详情。

答案 1 :(得分:0)

Spring JdbcDaoSupport允许您执行一次查询。您要执行的是一个完整的过程。您可以将程序存储在MySQL中,并按照cy3er的建议调用它,也可以将其分解为单独的操作。

如果我正确理解,您首先执行SELECT ... INTO ...操作会产生update,然后产生SELECT ...会产生query

当你在java中时,你甚至应该测试第一个操作在做第二个操作之前给出了正确的结果。