如何返回数据库中全部联系人?JPA查询非唯一结果报错解决
问题分析与解决
报错“查询未返回唯一结果:2”的核心原因:你的JPA Repository方法getAllContacts()声明返回单个User对象,但执行SELECT * from USER会返回数据库中所有用户记录(当前有2条),JPA无法将多条结果映射到单个实体,因此抛出异常。
1. 修改JPA Repository代码
将方法返回类型改为集合List<User>,如果不需要自定义原生SQL,直接用Spring Data JPA提供的默认方法更简洁:
// 方式一:用Spring Data JPA默认方法,无需自定义查询 List<User> findAll(); // 方式二:保留自定义原生SQL,修改返回类型 @Query(value = "SELECT * from USER", nativeQuery = true) List<User> getAllContacts();
2. 修改控制器代码
接收集合类型的查询结果,将集合命名后添加到视图模型中:
public ModelAndView getAllContacts() { ModelAndView mav = new ModelAndView("getAllUser.jsp"); List<User> userList = userda.getAllContacts(); // 或调用userda.findAll() mav.addObject("userList", userList); // 给集合命名,方便视图层调用 return mav; }
3. 视图层(getAllUser.jsp)适配修改
在JSP中遍历集合展示所有联系人(需引入JSTL标签库):
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <html> <body> <h1>所有联系人</h1> <ul> <c:forEach items="${userList}" var="user"> <li>${user.toString()}</li> </c:forEach> </ul> </body> </html>
额外说明
- 方法命名尽量贴合Spring Data JPA规范,比如
findAll比getAllContacts更符合框架约定,能减少自定义查询的编写。 - 实体类
User的映射配置已正确匹配数据库表名,无需调整。
内容的提问来源于stack exchange,提问作者Mo Javeed
相关产品推荐
相关产品推荐

