java.sql.SQLException: Error: executeQueryForObject returned too many results.
at com.ibatis.sqlmap.engine.mapping.statement.MappedStatement.executeQueryForObject(MappedStatement.java:124)
at com.ibatis.sqlmap.engine.impl.SqlMapExecutorDelegate.queryForObject(SqlMapExecutorDelegate.java:518)
at com.ibatis.sqlmap.engine.impl.SqlMapExecutorDelegate.queryForObject(SqlMapExecutorDelegate.java:493)
at com.ibatis.sqlmap.engine.impl.SqlMapSessionImpl.queryForObject(SqlMapSessionImpl.java:106)
at com.ibatis.sqlmap.engine.impl.SqlMapSessionImpl.queryForObject(SqlMapSessionImpl.java:110)
at com.ibatis.sqlmap.engine.impl.SqlMapClientImpl.queryForObject(SqlMapClientImpl.java:86)
at com.cgj.dao.EmployeeDaoImpl.select(EmployeeDaoImpl.java:13)
at com.cgj.serice.ServiceImpl.selectEmployee(ServiceImpl.java:44)
at com.cgj.main.Testit.main(Testit.java:24)
Exception in thread "main" java.lang.NullPointerException
at com.cgj.main.Testit.main(Testit.java:25)现在Ibatis中写的查询语句是一个带group by分组的SQL语句,返回的resultClass是一个DTO实体类。即Ibatis中该SQL查询结果集的resultClass="protocolDTO",protocolDTO是一个JAVABEAN是实体类。由于业务的需要查询结果需要进行分页,在DAO中需要调用一个返回值为PageBean<ProtocolDTO>的方法以完成分页功能,DAO中自定义的方法也需要返回PageBean<ProtocolDTO>,其中PageBean是一个封装的分页类,ProtocolDTO是一个JAVABEAN是实体类,现在就报上面的错误。
原SQL如下形式:
<select id="searchProtocol" parameterClass="java.util.Map" resultClass="protocolDTO">
select a.id id,b.name,c.status,b.length,
decode(sum(b.length),0,0,b.length/sum(b.length) over(partition by b.name) * 100) rate
from a,b,c
where a.id=c.id and b.code=c.code
and b.state in ('12','16')
group by a.id id,b.name,c.status,b.length
</select>
但若改成如下形式却不再报上面的错误
<select id="searchProtocol" parameterClass="java.util.Map" resultClass="protocolDTO">
select d.id id,d.name name,d.status,d.rate
from(select a.id id,b.name name,c.status status,b.state state,
decode(sum(b.length),0,0,b.length/sum(b.length) over(partition by b.name) * 100) rate
from a,b,c
where a.id=c.id and b.code=c.code
group by a.id id,b.name,c.status,b.length) d
where d.state in ('12','16')
</select>
请各位高人指点这是为什么?实在搞不明白了!
万分感谢各位了!
at com.ibatis.sqlmap.engine.mapping.statement.MappedStatement.executeQueryForObject(MappedStatement.java:124)
at com.ibatis.sqlmap.engine.impl.SqlMapExecutorDelegate.queryForObject(SqlMapExecutorDelegate.java:518)
at com.ibatis.sqlmap.engine.impl.SqlMapExecutorDelegate.queryForObject(SqlMapExecutorDelegate.java:493)
at com.ibatis.sqlmap.engine.impl.SqlMapSessionImpl.queryForObject(SqlMapSessionImpl.java:106)
at com.ibatis.sqlmap.engine.impl.SqlMapSessionImpl.queryForObject(SqlMapSessionImpl.java:110)
at com.ibatis.sqlmap.engine.impl.SqlMapClientImpl.queryForObject(SqlMapClientImpl.java:86)
at com.cgj.dao.EmployeeDaoImpl.select(EmployeeDaoImpl.java:13)
at com.cgj.serice.ServiceImpl.selectEmployee(ServiceImpl.java:44)
at com.cgj.main.Testit.main(Testit.java:24)
Exception in thread "main" java.lang.NullPointerException
at com.cgj.main.Testit.main(Testit.java:25)现在Ibatis中写的查询语句是一个带group by分组的SQL语句,返回的resultClass是一个DTO实体类。即Ibatis中该SQL查询结果集的resultClass="protocolDTO",protocolDTO是一个JAVABEAN是实体类。由于业务的需要查询结果需要进行分页,在DAO中需要调用一个返回值为PageBean<ProtocolDTO>的方法以完成分页功能,DAO中自定义的方法也需要返回PageBean<ProtocolDTO>,其中PageBean是一个封装的分页类,ProtocolDTO是一个JAVABEAN是实体类,现在就报上面的错误。
原SQL如下形式:
<select id="searchProtocol" parameterClass="java.util.Map" resultClass="protocolDTO">
select a.id id,b.name,c.status,b.length,
decode(sum(b.length),0,0,b.length/sum(b.length) over(partition by b.name) * 100) rate
from a,b,c
where a.id=c.id and b.code=c.code
and b.state in ('12','16')
group by a.id id,b.name,c.status,b.length
</select>
但若改成如下形式却不再报上面的错误
<select id="searchProtocol" parameterClass="java.util.Map" resultClass="protocolDTO">
select d.id id,d.name name,d.status,d.rate
from(select a.id id,b.name name,c.status status,b.state state,
decode(sum(b.length),0,0,b.length/sum(b.length) over(partition by b.name) * 100) rate
from a,b,c
where a.id=c.id and b.code=c.code
group by a.id id,b.name,c.status,b.length) d
where d.state in ('12','16')
</select>
请各位高人指点这是为什么?实在搞不明白了!
万分感谢各位了!
解决方案 »
- 问个关于document.getElementById("")的问题~~请大神帮下吧~在线等
- jboss设置session timeout无效?
- MyEclipse 生成Web Service Client代码问题
- 手工运行tomcat6.exe与设置开机启动区别??
- 急!lomboz中运行servlet后出现访问jsp路径错误
- format在mssql中可以用什么替换?
- 大家帮我看这个报错是什么原因?帮我分析一下吧,谢谢了
- 关于Servlet的问题!!!!!!
- 如果FORM的ENCTYPE=\"multipart/form-data\"如何传值???在线等待
- 请问大家:普通的JAVABEAN是不是现在用的不多了?
- 求助高手org.hibernate.exception.SQLGrammarException: could not execute query ?
- jsp的charset问题
select a.id id,b.name,c.status,b.length,
decode(sum(b.length),0,0,b.length/sum(b.length) over(partition by b.name) * 100) rate
from a,b,c
where a.id=c.id and b.code=c.code
and b.state in ('12','16')
group by a.id id,b.name,c.status,b.length
和
select d.id id,d.name name,d.status,d.rate
from(select a.id id,b.name name,c.status status,b.state state,
decode(sum(b.length),0,0,b.length/sum(b.length) over(partition by b.name) * 100) rate
from a,b,c
where a.id=c.id and b.code=c.code
group by a.id id,b.name,c.status,b.length) d
where d.state in ('12','16')这俩个SQL语句放在 数据库里面跑一遍就知道了
第一条返回的是多条记录
第二条返回的只有一条记录
而你却用的是queryForObject 当然会报错。
不过我已经在PL/SQL里跑过了上面2种形式的SQL,但都是查询出来有多条满足条件的数据库记录,另外因为该SQL查询出来的结果需要进行分页,而分页的DAO必须返回形如PageBean<ProtocolDTO>这种形式,PageBean是封装的分页类。所以用queryForList不行。而我现在的问题是为什么第一种形式的SQL就报executeQueryForObject returned too many results这个错误,而第二种形式的SQL却不会报这种错误了?实在看不出他们的区别所在,两种形式的SQL都能返回多条记录,这个我已经跑过了!
俩条SQL语句都会报错才对。
楼主好好看看,是不是出了SQL语句,还有其他地方不一样。
现在主要就是有一个分页的类,要实现分页必须调用queryListForPage这个方法实现分页,而该方法返回的就是一个PageBean<自定义DTO>,否则将不能实现分页。所以没法用Ibatis的queryForList方法。很是纠结这个问题,请高手指点指点这两种形式的SQL是咋回事?为什么第一种不行,而第二种在外面包一个SELECT就可以了?
这个,那你吧pageBean贴出来看看还有你查询的哪个queryListForPage的代码贴出来看看