Spring+Hibernate项目中订单详情页无法显示数据求助
问题描述
点击“创建订单”按钮后,用户被重定向到URL:localhost:8080/currentorder/{id},访问该URL后本应显示order.text等订单信息(比如order.getStatus()),但页面无法展示任何订单数据。
已尝试的解决方法
在DAO中创建了一个通过ID查询订单的方法,使用HQL语句查询,但页面依旧无法显示数据。我知道需要正确查询数据库并返回订单对象,但不知道具体怎么操作,求帮助。
相关代码
DAO初始实现
public List show(Long id) { Transaction tx = null; try (Session session = BogPomogi.getSessionFactory().openSession()) { session.beginTransaction(); Query query = session.createQuery("from Order where id = :id"); query.setParameter("id", id); List result = query.getResultList(); session.getTransaction().commit(); return result; } }
Controller代码
@PostMapping("/") public String createOrder (@ModelAttribute("order") Orderdao orderdao, String text, Model model, RedirectAttributes redirectAttributes){ orderdao.createOrder(text); redirectAttributes.addAttribute("id", orderdao.checkLastOrder()); return "redirect:/currentorders/{id}"; } @GetMapping("/currentorders/{id}") public String showOrder (@PathVariable("id") Long id, Orderdao orderdao, Model model, Order order){ model.addAttribute("currentOrder", orderdao.show(id)); return "order"; }
Entity代码
@Entity @Table(name = "orders") public class Order implements Serializable{ @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String text; private String customer; private int status; public Order(String text, String customer, int status) { this.text = text; this.customer = customer; this.status = status; } public Order(String customer) { this.customer = customer; } public Order(){ } //Getters and setters }
修改后的DAO方法(仍有问题)
public Order show(Long id) { Transaction tx = null; try (Session session = BogPomogi.getSessionFactory().openSession()) { session.beginTransaction(); Query query = session.createQuery("from Order where id = :id"); query.setParameter("id", id); List result = (List) query.getSingleResult(); session.getTransaction().commit(); return (Order) session.save(result); } }
问题分析与修复方案
1. DAO方法的核心错误
- 初始方法返回
List,但订单ID是唯一主键,应该返回单个Order对象,否则前端模板无法正确解析单个实体的属性。 - 修改后的方法存在两处致命错误:
query.getSingleResult()返回的是单个Order实例,强制转为List会直接抛出类型转换异常。session.save(result)用于保存新实体,这里查询的是已有数据,不需要调用该方法,且传入List会触发参数错误。
2. 正确的DAO实现
修改show方法,直接返回单个Order对象:
public Order show(Long id) { Transaction tx = null; try (Session session = BogPomogi.getSessionFactory().openSession()) { tx = session.beginTransaction(); // 直接通过主键查询,比HQL更高效简洁 Order order = session.get(Order.class, id); tx.commit(); return order; // 也可以用泛型HQL方式: // Query<Order> query = session.createQuery("from Order where id = :id", Order.class); // query.setParameter("id", id); // return query.getSingleResult(); } catch (Exception e) { if (tx != null) { tx.rollback(); // 异常时回滚事务 } e.printStackTrace(); return null; } }
3. Controller优化
showOrder方法中的Order order参数无实际作用,可直接删除,避免不必要的对象创建。- 验证
orderdao.checkLastOrder()的返回值,确保确实是刚创建的订单ID,避免重定向到无效ID。
4. 前端模板验证(以Thymeleaf为例)
确保模板order.html正确引用模型中的单个订单对象:
<div> <p>订单ID: <span th:text="${currentOrder.id}"></span></p> <p>订单内容: <span th:text="${currentOrder.text}"></span></p> <p>订单状态: <span th:text="${currentOrder.status}"></span></p> </div>
5. 其他检查项
- 确认
Order实体的所有属性都有对应的getter方法,模板依赖getter获取属性值。 - 查看数据库,确认目标ID的订单记录确实存在。
- 检查控制台日志,排查是否有SQL执行异常、事务回滚或空指针错误。
内容的提问来源于stack exchange,提问作者therepanic
相关产品推荐
相关产品推荐

