“产品名”相同的数据记录有多条,java用getByProName()查询报错

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相同的数据记录查询出来么?

5个回答

List<Products > list = productsDao.queryByProName(proName);

productsDao里的queryByProName方法改为返回List。
同样,访问数据的持久层用的什么技术(mybatis?),queryByProName调用的sql也需要返回多条结果。

修改的不只是一处。

greensure
greensure 给力,bug原因是mybatis中配置:<select id="**" resultType="**" parameterType="java.lang.String">应该改成一个可以对应List的, parameterType="java.lang.String"换成:resultMap="productsResultMap"就解决了bug,谢谢大神
接近 3 年之前 回复

你返回类型对应有问题,也就是mybatis的sql标签返回类型有问题
分析:你的sql端应该是返回单独的一个对象类型。查询出现多条记录,多对一出错。而你的解决方式,只改了java业务端为集合形式,但是sql端没

变,所以依然出错),
解决:sql端改成标签 返回类型. resultMap集合,然后java业务端返回类型改成list集合对应,接收即可

greensure
greensure 谢谢,问题正出现这个地方
接近 3 年之前 回复

你返回类型对应有问题,也就是mybtis的sql标签返回类型有问题
分析:你的sql端应该是单独的一个对象类型,查询出现多条记录,多对一出错。而你的解决方式,只改了java业务端为集合形式,但是sql端没

变,所以依然出错),
解决:sql端改成list集合,然后java业务端返回类型改成集合对应的即可

图片说明

greensure
greensure 谢谢,可惜只可以采纳一次,bug已经解决
接近 3 年之前 回复

你要改productsDap.queryByProName方法 它返回的就是一个Products对象 把queryByProName方法里的selectOne方法改成selectList方法

需要修改的地方如下:

sql配置端:



。。。其他属性略


select * from product where userName like #{proName}

    java端:
    List<Products > list = productsDao.queryByProNames(proName);//查询多条的方法
    ===此为修改代码片段=====
baixuefeng1
90mark 。。。标签不能显示出来
接近 3 年之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问