Jdbc 子查询 参数 BadSqlGrammarException:

2Tu 2011-12-21 04:02:19
String selectSQL = "select top ? * from (select top ? song.singer_id,song.song_id,song.song_name,song.title_url,song.mv_url,singer.singer_name from webdb_prod_song as song,webdb_prod_singer as singer where song.singer_id=singer.singer_id) as music where music.singer_id not in (select top ? song.singer_id from webdb_prod_song as song,webdb_prod_singer as singer where song.singer_id=singer.singer_id)";
Object[] args = { maxRows, maxRows*pageNo, maxRows*(pageNo - 1) };


List<Musics> listMusics = new ArrayList<Musics>();
SqlRowSet rs = musicJdbcTemplate.queryForRowSet(selectSQL,args);
// SqlRowSet rs = musicJdbcTemplate.queryForRowSet(selectSQL);
while (rs.next()) {
如果我不用?占位,则没有任何问题,求解

org.springframework.web.util.NestedServletException: Request processing failed; nested exception is org.springframework.jdbc.BadSqlGrammarException: PreparedStatementCallback; bad SQL grammar [select top ? * from (select top ? song.singer_id,song.song_id,song.song_name,song.title_url,song.mv_url,singer.singer_name from webdb_prod_song as song,webdb_prod_singer as singer where song.singer_id=singer.singer_id) as music where music.singer_id not in (select top ? song.singer_id from webdb_prod_song as song,webdb_prod_singer as singer where song.singer_id=singer.singer_id)]; nested exception is com.microsoft.sqlserver.jdbc.SQLServerException: '@P0' 附近有语法错误。
org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:583)
org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:501)
javax.servlet.http.HttpServlet.service(HttpServlet.java:617)
javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:96)
org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76)
...全文
1231 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
2Tu 2011-12-21
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 abstruct 的回复:]

错误显示你的sql语法错误。
在你用?占位的时候sql应该会变成 select top @P0 * from ....
而并非你想的是sql拼接。用你的数字去替换。数字替换是在试行过程当中。
就正如我们写一个select ? * from tab 用 tab.a去代替问号。但是出来的结果并非tab.a列的值,而只是"tab.a"
[/Quote]感谢. 确实如此,解决了.
解决之道:http://blog.csdn.net/repoem/article/details/7092117
2Tu 2011-12-21
  • 打赏
  • 举报
回复
[Quote=引用楼主 repoem 的回复:]
String selectSQL = "select top ? * from (select top ? song.singer_id,song.song_id,song.song_name,song.title_url,song.mv_url,singer.singer_name from webdb_prod_song as song,webdb_prod_singer as singer ……
[/Quote]的确如此,不能在top 后面放占位符
安特矮油 2011-12-21
  • 打赏
  • 举报
回复
错误显示你的sql语法错误。
在你用?占位的时候sql应该会变成 select top @P0 * from ....
而并非你想的是sql拼接。用你的数字去替换。数字替换是在试行过程当中。
就正如我们写一个select ? * from tab 用 tab.a去代替问号。但是出来的结果并非tab.a列的值,而只是"tab.a"
工布之者 2011-12-21
  • 打赏
  • 举报
回复
把AS 表别名,的AS去掉。
工布之者 2011-12-21
  • 打赏
  • 举报
回复
从没看到这样写的,?站位符不是要放到条件中的吗?

81,092

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧