报错‘Order is not mapped’,求修正INSERT HQL语句实现数据入库
问题解决:修正HQL语句实现文本入库并解决“Order is not mapped”错误
错误原因分析
- “Order is not mapped”错误:HQL语句中使用的
Order未对应到正确的实体类映射。可能是实体类未添加@Entity注解、类名与HQL中不一致,或是SessionFactory未扫描到该实体类;另外Order是SQL关键字,直接用作实体类名可能引发冲突,建议给实体类指定数据库表名。 - HQL语句逻辑错误:原语句
insert into Order(text) select text from text完全不符合需求——select text from text既不是查询实体类,也未绑定传入的参数,属于语法和逻辑双重错误。 - 代码冗余:try-with-resources语法会自动关闭Session,无需手动调用
session.close()。 - 控制器参数混淆:
@ModelAttribute("order") Orderdao orderdao错误地将DAO类作为实体类绑定,DAO类无需通过@ModelAttribute接收。
修正步骤与代码示例
1. 确保实体类正确映射
假设你的实体类为Order(若类名不同则替换),添加注解并规避SQL关键字冲突:
@Entity @Table(name = "orders") // 指定数据库表名,避免与SQL关键字Order冲突 public class Order { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String text; // 与业务逻辑中要存储的文本字段对应 // Getter、Setter方法 public String getText() { return text; } public void setText(String text) { this.text = text; } }
2. 修正业务层createOrder方法(推荐ORM实体保存方式)
直接创建实体对象并保存,符合Hibernate的ORM设计思想,逻辑更清晰:
public void createOrder(String text) { try (Session session = BogPomogi.getSessionFactory().openSession()) { Transaction tx = session.beginTransaction(); // 创建实体对象并赋值 Order order = new Order(); order.setText(text); session.persist(order); // 保存实体到数据库 tx.commit(); // try-with-resources自动关闭Session,无需手动调用close } catch (Exception e) { e.printStackTrace(); // 异常时可添加事务回滚逻辑 } }
3. 修正控制器代码
移除错误的@ModelAttribute绑定,直接接收文本参数:
// 假设orderdao已通过@Autowired注入 public String createOrder(String text) { orderdao.createOrder(text); return "redirect:/"; }
可选:使用修正后的HQL语句(不推荐,仅作参考)
若坚持使用HQL插入,需通过参数绑定传递文本值:
public void createOrder(String text) { try (Session session = BogPomogi.getSessionFactory().openSession()) { Transaction tx = session.beginTransaction(); // 注意HQL中使用实体类名和属性名,而非数据库表名和字段名 Query create = session.createQuery("insert into Order(text) values (:inputText)"); create.setParameter("inputText", text); // 绑定传入的文本参数 int result = create.executeUpdate(); tx.commit(); } catch (Exception e) { e.printStackTrace(); } }
内容的提问来源于stack exchange,提问作者therepanic
相关产品推荐
相关产品推荐

