sql查询时in()中的参数过长

lang5462 2010-01-18 05:57:00
我在用 in 查询时出了下面的一个错 参数大于2000个时这会出这个错

各位有没有好的方法解决这个问题。


2010-01-18 17:15:16,812 [10498154@qtp0-56] ERROR util.JDBCExceptionReporter - Prepared or callable statement has more than 2000 parameter markers.
2010-01-18 17:15:16,859 [10498154@qtp0-56] ERROR errors.GrailsExceptionResolver - org.springframework.dao.DataIntegrityViolationException: could not execute query; nested exception is org.hibernate.exception.DataException: could not execute query
org.codehaus.groovy.runtime.InvokerInvocationException: org.springframework.dao.DataIntegrityViolationException: could not execute query; nested exception is org.hibernate.exception.DataException: could not execute query
at org.codehaus.groovy.reflection.CachedMethod.invoke(CachedMethod.java:92)
at groovy.lang.MetaMethod.doMethodInvoke(MetaMethod.java:234)
at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:1062)
at groovy.lang.ExpandoMetaClass.invokeMethod(ExpandoMetaClass.java:926)
at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:893)
at groovy.lang.Closure.call(Closure.java:279)
at groovy.lang.Closure.call(Closure.java:274)
at org.codehaus.groovy.grails.web.servlet.mvc.SimpleGrailsControllerHelper.handleAction(SimpleGrailsControllerHelper.java:368)
at org.codehaus.groovy.grails.web.servlet.mvc.SimpleGrailsControllerHelper.executeAction(SimpleGrailsControllerHelper.java:243)
at org.codehaus.groovy.grails.web.servlet.mvc.SimpleGrailsControllerHelper.handleURI(SimpleGrailsControllerHelper.java:203)
at org.codehaus.groovy.grails.web.servlet.mvc.SimpleGrailsControllerHelper.handleURI(SimpleGrailsControllerHelper.java:138)
at org.codehaus.groovy.grails.web.servlet.mvc.SimpleGrailsController.handleRequest(SimpleGrailsController.java:88)
at org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter.handle(SimpleControllerHandlerAdapter.java:48)
at org.codehaus.groovy.grails.web.servlet.GrailsDispatcherServlet.doDispatch(GrailsDispatcherServlet.java:264)
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:807)
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:571)
at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:511)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:727)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:820)
at org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java:502)
at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1124)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:70)
at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1115)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:70)
at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1115)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:70)
at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1115)
at org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:361)
at org.mortbay.jetty.security.SecurityHandler.handle(SecurityHandler.java:216)
at org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:181)
at org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:766)
at org.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.java:417)
at org.mortbay.jetty.servlet.Dispatcher.forward(Dispatcher.java:334)
at org.mortbay.jetty.servlet.Dispatcher.forward(Dispatcher.java:126)
at org.codehaus.groovy.grails.web.util.WebUtils.forwardRequestForUrlMappingInfo(WebUtils.java:293)
at org.codehaus.groovy.grails.web.util.WebUtils.forwardRequestForUrlMappingInfo(WebUtils.java:269)
at org.codehaus.groovy.grails.web.util.WebUtils.forwardRequestForUrlMappingInfo(WebUtils.java:261)
at org.codehaus.groovy.grails.web.mapping.filter.UrlMappingsFilter.doFilterInternal(UrlMappingsFilter.java:181)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76)
at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1115)
at org.codehaus.groovy.grails.web.sitemesh.GrailsPageFilter.obtainContent(GrailsPageFilter.java:221)
at org.codehaus.groovy.grails.web.sitemesh.GrailsPageFilter.doFilter(GrailsPageFilter.java:126)
at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1115)
at org.codehaus.groovy.grails.web.servlet.filter.GrailsReloadServletFilter.doFilterInternal(GrailsReloadServletFilter.java:101)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76)
at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1115)
at org.codehaus.groovy.grails.web.servlet.mvc.GrailsWebRequestFilter.doFilterInternal(GrailsWebRequestFilter.java:65)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76)
at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1115)
at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:96)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76)
at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:236)
at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:167)
at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1115)
at org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:361)
at org.mortbay.jetty.security.SecurityHandler.handle(SecurityHandler.java:216)
at org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:181)
at org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:766)
at org.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.java:417)
at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152)
at org.mortbay.jetty.Server.handle(Server.java:324)
at org.mortbay.jetty.HttpConnection.handleRequest(HttpConnection.java:534)
at org.mortbay.jetty.HttpConnection$RequestHandler.content(HttpConnection.java:879)
at org.mortbay.jetty.HttpParser.parseNext(HttpParser.java:741)
at org.mortbay.jetty.HttpParser.parseAvailable(HttpParser.java:213)
at org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:403)
at org.mortbay.io.nio.SelectChannelEndPoint.run(SelectChannelEndPoint.java:409)
at org.mortbay.thread.QueuedThreadPool$PoolThread.run(QueuedThreadPool.java:522)
Caused by: org.springframework.dao.DataIntegrityViolationException: could not execute query; nested exception is org.hibernate.exception.DataException: could not execute query
at AccountPersonalController$_closure6.doCall(AccountPersonalController.groovy:174)
at AccountPersonalController$_closure6.doCall(AccountPersonalController.groovy)
Caused by: org.hibernate.exception.DataException: could not execute query
... 2 more
Caused by: java.sql.SQLException: Prepared or callable statement has more than 2000 parameter markers.
at net.sourceforge.jtds.jdbc.SQLParser.parse(SQLParser.java:1139)
at net.sourceforge.jtds.jdbc.SQLParser.parse(SQLParser.java:156)
at net.sourceforge.jtds.jdbc.JtdsPreparedStatement.<init>(JtdsPreparedStatement.java:107)
at net.sourceforge.jtds.jdbc.ConnectionJDBC2.prepareStatement(ConnectionJDBC2.java:2456)
at net.sourceforge.jtds.jdbc.ConnectionJDBC2.prepareStatement(ConnectionJDBC2.java:2414)
... 2 more
...全文
1745 39 打赏 收藏 转发到动态 举报
写回复
用AI写文章
39 条回复
切换为时间正序
请发表友善的回复…
发表回复
yuzexu 2010-09-02
  • 打赏
  • 举报
回复
2000个参数有什么不正常吗?
根据做不同的系统不同的业务 sql的复杂程度是不一样的
有的人 认为2000多个参数是业务或sql有问题,那我要出个业务看你怎么办?

数据表
Dept 对 Employee 一对多
Employee 对 Computer 一对多
现在有一棵部门主机树
部门:500个
主机:10000个
现在我想查询所有选择的主机对应的员工信息 你怎么查?
(我先全选树中所有节点,然后再去掉一个主机节点的选择状态,意思是我选择了9999个主机)
humor200 2010-01-20
  • 打赏
  • 举报
回复
这种写法的实现思想估计有问题
acridin 2010-01-20
  • 打赏
  • 举报
回复
太麻烦了
fireman_me 2010-01-20
  • 打赏
  • 举报
回复
程序需要优化了。
tuo_bing 2010-01-20
  • 打赏
  • 举报
回复
学习 。。。。
zhengpeiyong 2010-01-20
  • 打赏
  • 举报
回复
[Quote=引用 29 楼 java2000_net 的回复:]
SQL codeselect*from accountwhere managerin

有2个问题,
第一,这些manager是否能通过sql得到呢?总不会是你手工选择了2000个人,然后提交的吧,他们总会有一个规则,那么你就可以通过

select * from account where manager in (select id from manager where type=1)

之类的子查询来实现了

第二、如果就是一个一个选的,那么你只能减少参数数量,比如1000个一次,调用2次
然后再应用合并结果
这个类似于sql的 union操作


[/Quote]

steel1985 2010-01-20
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 zl3450341 的回复:]
引用 9 楼 zhj92lxs 的回复:
select * from account where manager in (select manager_col from manager_table wehre xxx= xxx)
这种不可以满足吗

in 查询效率是很低的,可以用exists替代的

SELECT title
FROM titles
WHERE EXISTS
  (SELECT *
  FROM publishers
  WHERE pub_id = titles.pub_id
  )


SELECT title
FROM titles
WHERE pub_id IN
  (SELECT pub_id
  FROM publishers
  )


up
[/Quote]
.....
Dogfish 2010-01-20
  • 打赏
  • 举报
回复
in的数据越多,sql语句越慢。要优化。
  • 打赏
  • 举报
回复
没考虑需求
BearKin 2010-01-20
  • 打赏
  • 举报
回复
[Quote=引用 29 楼 java2000_net 的回复:]
SQL codeselect*from accountwhere managerin

有2个问题,
第一,这些manager是否能通过sql得到呢?总不会是你手工选择了2000个人,然后提交的吧,他们总会有一个规则,那么你就可以通过

select * from account where manager in (select id from manager where type=1)

之类的子查询来实现了

第二、如果就是一个一个选的,那么你只能减少参数数量,比如1000个一次,调用2次
然后再应用合并结果
这个类似于sql的 union操作


[/Quote]

大版主经验丰厚啊..
老紫竹 2010-01-20
  • 打赏
  • 举报
回复
select * from account where manager in


有2个问题,
第一,这些manager是否能通过sql得到呢?总不会是你手工选择了2000个人,然后提交的吧,他们总会有一个规则,那么你就可以通过

select * from account where manager in (select id from manager where type=1)

之类的子查询来实现了

第二、如果就是一个一个选的,那么你只能减少参数数量,比如1000个一次,调用2次
然后再应用合并结果
这个类似于sql的 union操作

lgq_0714 2010-01-20
  • 打赏
  • 举报
回复
[Quote=引用 24 楼 bao110908 的回复:]
关系型数据不能百分百地转为对象型数据,人是活的,代码是死的,有简单的办法,为什么要去弄那么复杂的呢?

数据库对于 SQL 语句的长度是有一定限制的。
[/Quote]
支持火龙哥!
mucrea 2010-01-20
  • 打赏
  • 举报
回复
用exist或者拆开用 || 再或者用union把各个查询链接起来,如果还不行,好好分析一下你的2000个参数,难道就没有一些规律么,比如说这一个范围之间,或者是在某个表受某种条件制约么。in的效率是相当低的尤其是参数多的时候,如果数据库不提示2000个以内,你会把数据库给干蹦的。
BearKin 2010-01-20
  • 打赏
  • 举报
回复

猜对了 不过手选2000个..阁下有魄力!
horizonlyhw 2010-01-19
  • 打赏
  • 举报
回复
暫時和exists還沒關係~~ 現在的方式 都不是在sql裡面的查詢啊
crazylaa 2010-01-19
  • 打赏
  • 举报
回复
[Quote=引用 22 楼 lang5462 的回复:]
问题是 我是从程序里传过去的 怎么用  exists

尽量用面向对象来解决。。不用纯的sql语句
[/Quote]
存储过程吧。。。
  • 打赏
  • 举报
回复
关系型数据不能百分百地转为对象型数据,人是活的,代码是死的,有简单的办法,为什么要去弄那么复杂的呢?

数据库对于 SQL 语句的长度是有一定限制的。
petrarca 2010-01-19
  • 打赏
  • 举报
回复
每次传200个没有问题撒。
lang5462 2010-01-19
  • 打赏
  • 举报
回复
问题是 我是从程序里传过去的 怎么用 exists

尽量用面向对象来解决。。不用纯的sql语句
BearKin 2010-01-19
  • 打赏
  • 举报
回复
用exists的前提是这个真的是从数据库中查出来的 不是某些人手选的 如果手选的2000个 那就悲剧了...
加载更多回复(19)

67,513

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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