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);
答案 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中时,你甚至应该测试第一个操作在做第二个操作之前给出了正确的结果。