You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 12:15:48