javax.persistence.NonUniqueResultException错误

本文探讨了在使用findByName方法查询数据库时遇到的NonUniqueResultException异常问题,该异常出现的原因是方法预期返回单一结果但数据库返回了多条记录。文章建议将DAO层的方法修改为countByName,返回类型改为Long,以避免异常并正确处理多结果情况。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

javax.persistence.NonUniqueResultException: result returns more than one elements

这个方法经过查阅发现很局限,他要求必须只能返回一个值:多了抛出NonUniqueResultException异常,查询不到结果抛出NoResultException异常。所以方法慎用!

修改:
dao层应修改方法为countByName(),返回值为Long(大写)
之前是findByName(),因为这个方法返回的是一条数据,所以当在数据库中查到1条以上时便会出现这种错误。

Jul 23, 2025, 9:20:20,178 AM China Standard Time> <Warning> <EJB> <BEA-010227> <EJB exception occurred during invocation from home or business: com.lkm.ejb.tooldb.server.ToolCheckDbEjb_gfpdem_Intf of EJB: ToolCheckDbEjb(Application: LkmPoiEjbs, EJBComponent: ToolDbEjb.jar) generated exception: javax.persistence.NonUniqueResultException: More than one result was returned from Query.getSingleResult(), private String buildDynamicQuery(Map<String, String> queryMap, Map<String, String> sortMap, boolean isCountQuery) { StringBuilder sqlBuilder = new StringBuilder(); if (isCountQuery) { sqlBuilder.append("SELECT COUNT(c) "); } else { sqlBuilder.append("SELECT c.id, c.orgCode, c.locator, c.empNo, c.empName, "); sqlBuilder.append("c.itemCode, c.itemDesc, c.useableQty, c.unUseableQty, c.demageQty, "); sqlBuilder.append("c.offQty, c.signNo, c.checkoutEmpNo, c.checkoutEmpName, c.checkOutDate, "); sqlBuilder.append("c.finishedEmpNo, c.finishedEmpName, c.finishedDate, c.payMoney, c.overTime, "); sqlBuilder.append("MAX(n.oldToolGatherNo), c.requestNo, c.erpState "); } sqlBuilder.append("FROM ToolCheckEntity c LEFT JOIN ToolNoteRequestEntity n ON n.requestNo = c.requestNo "); // StringBuilder sqlBuilder = new StringBuilder(); // sqlBuilder.append("SELECT c.id, c.orgCode, c.locator, c.empNo, c.empName, "); // sqlBuilder.append("c.itemCode, c.itemDesc, c.useableQty, c.unUseableQty, c.demageQty, "); // sqlBuilder.append("c.offQty, c.signNo, c.checkoutEmpNo, c.checkoutEmpName, c.checkOutDate, "); // sqlBuilder.append("c.finishedEmpNo, c.finishedEmpName, c.finishedDate, c.payMoney, c.overTime, "); // sqlBuilder.append("n.oldToolGatherNo, c.requestNo, c.erpState "); // sqlBuilder.append("FROM ToolCheckEntity c LEFT JOIN ToolNoteRequestEntity n ON n.requestNo = c.requestNo "); // 添加WHERE条件 if (queryMap != null && !queryMap.isEmpty()) { sqlBuilder.append("WHERE "); boolean firstCondition = true; // 处理orgCode条件 if (queryMap.containsKey("orgCode") && StringUtils.isNotBlank(queryMap.get("orgCode"))) { sqlBuilder.append("c.orgCode = :orgCode "); firstCondition = false; } // 处理locator条件 if (queryMap.containsKey("locator") && StringUtils.isNotBlank(queryMap.get("locator"))) { if (!firstCondition) sqlBuilder.append("AND "); sqlBuilder.append("c.locator = :locator "); firstCondition = false; } // 处理empNo条件 if (queryMap.containsKey("empNo") && StringUtils.isNotBlank(queryMap.get("empNo"))) { if (!firstCondition) sqlBuilder.append("AND "); sqlBuilder.append("c.empNo = :empNo "); firstCondition = false; } if (queryMap.containsKey("itemCode") && StringUtils.isNotBlank(queryMap.get("itemCode"))) { if (!firstCondition) sqlBuilder.append("AND "); sqlBuilder.append("c.itemCode like :itemCode "); firstCondition = false; } if (queryMap.containsKey("startDate") && StringUtils.isNotBlank(queryMap.get("startDate"))&& queryMap.containsKey("endDate") && StringUtils.isNotBlank(queryMap.get("endDate")) ){ if (!firstCondition) sqlBuilder.append("AND "); // 添加日期范围条件 - 根据业务需求选择合适的日期字段 sqlBuilder.append("(c.checkOutDate BETWEEN :startDate AND :endDate) "); firstCondition = false; } // 如果没有有效条件,移除WHERE关键字 if (firstCondition) { sqlBuilder.setLength(sqlBuilder.length() - 6); // 移除"WHERE " } } String groupByStr=" group by c.id, c.orgCode, c.locator, c.empNo, c.empName, \n" + " c.itemCode, c.itemDesc, c.useableQty, c.unUseableQty, \n" + " c.demageQty, c.offQty, c.signNo, c.checkoutEmpNo, \n" + " c.checkoutEmpName, c.checkOutDate, c.finishedEmpNo, \n" + " c.finishedEmpName, c.finishedDate, c.payMoney, \n" + " c.overTime, c.requestNo, c.erpState"; sqlBuilder.append(groupByStr); return sqlBuilder.toString(); }
最新发布
07-24
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值