跪求:请各位ibatis高人指点下面这个错误,万分感谢!

machelli 2011-06-23 09:20:11
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>
请各位高人指点这是为什么?实在搞不明白了!
万分感谢各位了!

...全文
440 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
流星谜 2011-06-25
  • 打赏
  • 举报
回复
你还是要看那个分页源码的,DJ Java Decompiler 反编译工具,网上下个就可以了
machelli 2011-06-24
  • 打赏
  • 举报
回复
因为这些被封装起来,已经打成jar包了,没法查看它的源代码,这个queryListForPage()的原理和Ibatis的queryForPaginatedList()分页方法的原理类似,而PageBean类里就是一些goPage,pageSize等与分页有关的属性,另外还包含一个list属性。挺恼火这个问题!
javaors 2011-06-24
  • 打赏
  • 举报
回复
自己将
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 当然会报错。
javaors 2011-06-24
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 machelli 的回复:]
引用 7 楼 javaors 的回复:
那按原理上面将 queryForObject 是不可能返回多条记录的。
俩条SQL语句都会报错才对。
楼主好好看看,是不是出了SQL语句,还有其他地方不一样。

一般来说queryForObject只适合于以ID这样的值唯一的字段作为条件查询,这样返回的就是只有一条记录。
现在主要就是有一个分页的类,要实现分页必须调用queryListForPa……
[/Quote]

这个,那你吧pageBean贴出来看看

还有你查询的哪个queryListForPage的代码贴出来看看
machelli 2011-06-24
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 javaors 的回复:]
那按原理上面将 queryForObject 是不可能返回多条记录的。
俩条SQL语句都会报错才对。
楼主好好看看,是不是出了SQL语句,还有其他地方不一样。
[/Quote]
一般来说queryForObject只适合于以ID这样的值唯一的字段作为条件查询,这样返回的就是只有一条记录。
现在主要就是有一个分页的类,要实现分页必须调用queryListForPage这个方法实现分页,而该方法返回的就是一个PageBean<自定义DTO>,否则将不能实现分页。所以没法用Ibatis的queryForList方法。很是纠结这个问题,请高手指点指点这两种形式的SQL是咋回事?为什么第一种不行,而第二种在外面包一个SELECT就可以了?
javaors 2011-06-24
  • 打赏
  • 举报
回复
那按原理上面将 queryForObject 是不可能返回多条记录的。
俩条SQL语句都会报错才对。
楼主好好看看,是不是出了SQL语句,还有其他地方不一样。
machelli 2011-06-24
  • 打赏
  • 举报
回复
感谢各位热心人的帮助。
不过我已经在PL/SQL里跑过了上面2种形式的SQL,但都是查询出来有多条满足条件的数据库记录,另外因为该SQL查询出来的结果需要进行分页,而分页的DAO必须返回形如PageBean<ProtocolDTO>这种形式,PageBean是封装的分页类。所以用queryForList不行。而我现在的问题是为什么第一种形式的SQL就报executeQueryForObject returned too many results这个错误,而第二种形式的SQL却不会报这种错误了?实在看不出他们的区别所在,两种形式的SQL都能返回多条记录,这个我已经跑过了!
哎呦喂哈 2011-06-24
  • 打赏
  • 举报
回复
用的是queryForObject吧,查出来的是一个集合,应该用queryForList
swoky 2011-06-24
  • 打赏
  • 举报
回复
java.sql.SQLException: Error: executeQueryForObject returned too many results.

这己经够清楚了
淫生杯具 2011-06-23
  • 打赏
  • 举报
回复
有代码看下不?
Fly_m 2011-06-23
  • 打赏
  • 举报
回复
第一个错,你想只查出一条记录,结果却返回了多于一条的记录信息。你直接将这条记录弄到sql里去查,看下结果不就知道了。

81,092

社区成员

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

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