BUG: 数据库中产品名相同的记录有多条,当调用getByProName() 时会得到不止一条该“产品名”的数据记录,会报错
单元测试方法:
@Test
public void testQueryByProName() {
String proName = "小王子饼干";
Products products = productsDao.queryByProName(proName);
System.out.println("产品名: " + products.getProName());
System.out.println("信息: " + products);
// log.info("products ={} ", products);
}
报错:
org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.exceptions.TooManyResultsException: Expected one result (or null) to be returned by selectOne(), but found: 6
at org.mybatis.spring.MyBatisExceptionTranslator.translateExceptionIfPossible(MyBatisExceptionTranslator.java:75)
at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:371)
at com.sun.proxy.$Proxy13.selectOne(Unknown Source)
at org.mybatis.spring.SqlSessionTemplate.selectOne(SqlSessionTemplate.java:163)
at org.apache.ibatis.binding.MapperMethod.execute(MapperMethod.java:68)
at org.apache.ibatis.binding.MapperProxy.invoke(MapperProxy.java:52)
at com.sun.proxy.$Proxy14.queryByProName(Unknown Source)
at cn.syy.test.dao.ProductsDaoTest.testQueryByProName(ProductsDaoTest.java:43)
Caused by: org.apache.ibatis.exceptions.TooManyResultsException: Expected one result (or null) to be returned by selectOne(), but found: 6
at org.apache.ibatis.session.defaults.DefaultSqlSession.selectOne(DefaultSqlSession.java:70)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:358)
... 35 more
------- 然后我的解决思路:把返回的多条proname相同的数据记录放到List里,遍历输出,单元测试依然报错(相同的错)
修改单元测试方法:
@Test
public void testQueryByProName() {
String proName = "小王子饼干";
List list = (List) productsDao.queryByProName(proName);
for(Products p : list){
System.out.println("产品名: " + p.getProName());
System.out.println("信息: " + p);
}
}
org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.exceptions.TooManyResultsException: Expected one result (or null) to be returned by selectOne(), but found: 6
at org.mybatis.spring.MyBatisExceptionTranslator.translateExceptionIfPossible(MyBatisExceptionTranslator.java:75)
at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:371)
at com.sun.proxy.$Proxy13.selectOne(Unknown Source)
at org.mybatis.spring.SqlSessionTemplate.selectOne(SqlSessionTemplate.java:163)
at org.apache.ibatis.binding.MapperMethod.execute(MapperMethod.java:68)
at org.apache.ibatis.binding.MapperProxy.invoke(MapperProxy.java:52)
at com.sun.proxy.$Proxy14.queryByProName(Unknown Source)
at cn.syy.test.dao.ProductsDaoTest.testQueryByProName(ProductsDaoTest.java:52)
Caused by: org.apache.ibatis.exceptions.TooManyResultsException: Expected one result (or null) to be returned by selectOne(), but found: 6
at org.apache.ibatis.session.defaults.DefaultSqlSession.selectOne(DefaultSqlSession.java:70)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:358)
... 35 more
请问有啥办法能把proname相同的数据记录查询出来么?
List<Products > list = productsDao.queryByProName(proName);
productsDao里的queryByProName方法改为返回List。
同样,访问数据的持久层用的什么技术(mybatis?),queryByProName调用的sql也需要返回多条结果。
修改的不只是一处。
你要改productsDap.queryByProName方法 它返回的就是一个Products对象 把queryByProName方法里的selectOne方法改成selectList方法
你返回类型对应有问题,也就是mybatis的sql标签返回类型有问题
分析:你的sql端应该是返回单独的一个对象类型。查询出现多条记录,多对一出错。而你的解决方式,只改了java业务端为集合形式,但是sql端没
变,所以依然出错),
解决:sql端改成标签 返回类型. resultMap集合,然后java业务端返回类型改成list集合对应,接收即可
需要修改的地方如下:
sql配置端:
。。。其他属性略
select * from product where userName like #{proName}
java端:
List<Products > list = productsDao.queryByProNames(proName);//查询多条的方法
===此为修改代码片段=====
你返回类型对应有问题,也就是mybtis的sql标签返回类型有问题
分析:你的sql端应该是单独的一个对象类型,查询出现多条记录,多对一出错。而你的解决方式,只改了java业务端为集合形式,但是sql端没
变,所以依然出错),
解决:sql端改成list集合,然后java业务端返回类型改成集合对应的即可