hibernate中HQL练习时候一个小小的错误导致语法异常

本文介绍了一个基于Hibernate框架的Java程序示例,详细展示了如何实现用户的添加、查询、更新及删除等基本操作。

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

 1 package cn.db.po.test;
 2 
 3 import java.util.List;
 4 
 5 import cn.db.po.User;
 6 import cn.db.po.biz.UserBiz;
 7 
 8 public class TestFirstHib {
 9     public static void main(String[] args) {
10         //创建一个新用户
11         //User user=new User();
12         //user.setId(1001);
13         /*
14          * 删除的时候只要给后台传ID便可
15          * user.setName("accp");
16         user.setPassword("1111");
17         user.setTelephone("1341212");
18         user.setUserName("加多宝");*/
19         
20         //增加(保存)方法
21         UserBiz ub=new UserBiz();
22         /*ub.addNewUser(user);
23         System.out.println("add seccess");*/
24         
25         
26         //查询方法
27         /*user = ub.getUser(3);
28         System.out.println("查询结果:"+user.getUserName());*/
29         
30         
31         //更新方法
32         /*ub.updateUser(user);
33         user = ub.getUser(4);
34         System.out.println("update success"+user.getUserName());*/
35         
36         
37         /**
38          * 测试saveOrUpdate.如果不给指定ID则直接增加一行;
39          * 如果给定ID则先查询数据库有没有这一列,没有则执行更新
40          */
41         //ub.saveOrUpdateBiz(user);
42         
43         
44         //动态更新底层机制理解版本
45         /*ub.dynamicUpdate(user);*/
46         
47         //删除方法测试
48         //ub.delete(user);
49         
50         //因为现在没有提供参数所以括号里面写null
51         List<User> list = ub.findUsers(null);
52         
53         for (User u: list)
54             System.out.println("users对象名="+u.getName());
55         
56     }
57 }
测试类
  1 package cn.db.po.biz;
  2 
  3 import java.util.List;
  4 
  5 import org.hibernate.HibernateException;
  6 import org.hibernate.Transaction;
  7 
  8 import cn.db.po.User;
  9 import cn.db.po.common.HibernateSessionFactory;
 10 import cn.db.po.dao.UserDao;
 11 
 12 public class UserBiz {
 13     private UserDao dao = new UserDao();
 14 
 15     public void addNewUser(User user) {
 16         Transaction tx = null;// 定义事务处理对象
 17 
 18         // 通过会话开启事务,拿到的是唯一的属于自己的会话getSession()会调用getCurrentSession()
 19         try {
 20             // 1.获得会话并开启事务
 21             tx = HibernateSessionFactory.getSession().beginTransaction();
 22             dao.save(user);// 2.调Dao的方法
 23             tx.commit();// 3.提交
 24         } catch (HibernateException e) {
 25             if (tx != null) {
 26                 tx.rollback();// 4.失败回滚
 27             }
 28         }
 29         // getCurrentSession()不管提交成功还是失败回滚都会自动关闭连接
 30     }
 31 
 32     // 按ID查询
 33     public User getUser(java.io.Serializable id) {
 34         Transaction tx = null;
 35         User user = null;
 36         try {
 37             // 1.获得会话并开启事务
 38             tx = HibernateSessionFactory.getSession().beginTransaction();
 39             user = dao.findById(id);
 40             tx.commit();// 3.提交
 41         } catch (HibernateException e) {
 42             if (tx != null) {
 43                 tx.rollback();// 4.失败回滚
 44             }
 45         }
 46 
 47         return user;
 48     }
 49 
 50     // 更新操作
 51     public void updateUser(User user) {
 52         Transaction tx = null;
 53 
 54         try {
 55             // 1.获得会话并开启事务
 56             tx = HibernateSessionFactory.getSession().beginTransaction();
 57             dao.update(user);
 58             tx.commit();// 3.提交
 59         } catch (HibernateException e) {
 60             if (tx != null) {
 61                 tx.rollback();// 4.失败回滚
 62             }
 63         }
 64     }
 65 
 66     public void saveOrUpdateBiz(User user) {
 67         Transaction tx = null;
 68 
 69         try {
 70             // 1.获得会话并开启事务
 71             tx = HibernateSessionFactory.getSession().beginTransaction();
 72             dao.saveOrUpdateDemo(user);
 73             tx.commit();// 3.commit=flash()+commit();提交触发脏检查
 74         } catch (HibernateException e) {
 75             if (tx != null) {
 76                 tx.rollback();// 4.失败回滚
 77             }
 78         }
 79     }
 80 
 81     // 业务层的动态更新方法
 82     public void dynamicUpdate(User user) {
 83         Transaction tx = null;
 84 
 85         try {
 86             tx = HibernateSessionFactory.getSession().beginTransaction();
 87             dao.dynamicUpdate(user);
 88             tx.commit();
 89         } catch (HibernateException e) {
 90             if (tx != null) {
 91                 tx.rollback();
 92             }
 93         }
 94     }
 95 
 96     // 业务层的删除方法
 97     public void delete(User user) {
 98         Transaction tx = null;// 首先定义事务处理对象
 99 
100         try {
101             tx = HibernateSessionFactory.getSession().beginTransaction();
102             dao.delete(user);
103             tx.commit();
104         } catch (HibernateException e) {
105             if (tx != null) {
106                 tx.rollback();
107             }
108         }
109 
110     }
111 
112     // HQL查询演示视频上传直接复制写的,传的参数没管.??为什么?
113     public List<User> findUsers(User user) {
114         Transaction tx = null;
115         List<User> list = null;
116 
117         try {
118             tx = HibernateSessionFactory.getSession().beginTransaction();
119             list = dao.findUser();
120             tx.commit();
121         } catch (HibernateException e) {
122             e.printStackTrace();
123             if (tx != null) {
124                 tx.rollback();
125             }
126         }
127         return list;
128     }
129 }
业务层
  1 package cn.db.po.dao;
  2 //dao层开始测试
  3 import java.util.List;
  4 
  5 import org.hibernate.Query;
  6 
  7 import cn.db.po.User;
  8 import cn.db.po.common.HibernateSessionFactory;
  9 
 10 public class UserDao {
 11     //hibernate添加的方法1
 12     public void save(User user){
 13         HibernateSessionFactory.getSession().save(user);
 14     }
 15     
 16     /**
 17      * hibernate添加的方法2
 18      * 添加和更新很相似,干脆合并成一个方法了.就是说前台传过一个对象来,发现有变化就更新没变化就保存
 19      */
 20         public void saveOrUpdateDemo(User user){
 21             HibernateSessionFactory.getSession().saveOrUpdate(user);
 22         }
 23     
 24     
 25     //查询。按主键查询时传参   传实现的接口,User.class表示返回这个类的信息
 26     public User findById(java.io.Serializable id){
 27         return (User)HibernateSessionFactory.getSession()
 28                 .get(User.class, id);
 29         
 30         /**
 31          * 还有一个load()方法也是查询,使用、传参和get()一样的但是机制不一样.
 32          * 1.load是延迟加载。如果想实现个get一样的机制要在xml属性里面加lazy="false"
 33          * 2.get()查询到id是空时返回null,load()则直接报错;
 34          */
 35     }
 36     
 37     
 38     //hibernate更新的方法1
 39     public void update(User user){
 40         
 41         HibernateSessionFactory.getSession().update(user);
 42     
 43     }
 44     
 45     //hibernate动态更新演示
 46     public void dynamicUpdate(User user){
 47         
 48         /*1.//(动态更新底层机制理解版本)
 49          * 
 50          * User u=(User)HibernateSessionFactory.getSession().get(User.class, user.getId());
 51          * 检查的时候hibernate同时也得到了一个快照
 52         User u=(User)HibernateSessionFactory.getSession().get(User.class, user.getId());
 53         *//**
 54          * 首先ID不能动.
 55          * 从传过来的user对象里面取到的值赋值给查出来的u;user里面封装的是希望变成的值,
 56          * u里面是从数据库拿到的值.
 57          * 也就是相当于从数据库拿出来的时候拍了张快照,然后接着set用新值填充。接下来提交事务便可.
 58          * hibernate会先查询看哪里变化了,如果没有变化什么都不做;
 59          * 
 60          *//*
 61         u.setName(user.getName());
 62         u.setPassword(user.getPassword());
 63         u.setIsAdmin(user.getIsAdmin());
 64         u.setTelephone(user.getTelephone());
 65         u.setUserName(user.getUserName());*/
 66         //这时脏数据就产生了
 67         
 68         //2.简洁化后的merge()方法,实现原理和底层笨的方法是一样的.
 69         HibernateSessionFactory.getSession().merge(user);
 70         
 71     }
 72     
 73     
 74     //删除
 75     public void delete(User user){
 76         //hibernate建议先查询,根据返回的id来删除
 77         //User u=(User)HibernateSessionFactory.getSession().get(User.class, user.getId());
 78         //HibernateSessionFactory.getSession().delete(u);
 79         
 80         /**
 81          * 也可以根据用户对象来删除,前提是测试类中有指定id(也就是执行的时候给数据库指定一个id),
 82          * 以及映射配置文件中的映射列不能有非空条件存在
 83          */
 84         HibernateSessionFactory.getSession().delete(user);
 85         
 86     }
 87     
 88     /*//该方法是举例演示不执行:持久化所有对象,为了防止内存堵塞,每持久化20个对象进行一次缓存清理和清空
 89     public void saveAll(List<User> users){
 90         
 91         for (int i = 0; i < users.size(); i++) {
 92             HibernateSessionFactory.getSession().save(users);
 93             if (i%20==0) {
 94                 HibernateSessionFactory.getSession().close();
 95                 HibernateSessionFactory.getSession().clear();
 96             }
 97         }
 98         
 99     }*/
100     
101     
102     //HQL查询
103     public List<User> findUser(){
104         
105         //根据语句创建一个Query的实例
106         Query q = HibernateSessionFactory.getSession()
107                 .createQuery("from user");
108         
109         return q.list();
110     }
111     
112 }
Dao层

 报错信息:(dao层最有一个HQL 方法)

org.hibernate.hql.ast.QuerySyntaxException: user is not mapped [from user]

检查后发现,dao层的映射语句

Query q = HibernateSessionFactory.getSession()
.createQuery("from user");----->from user的U没有大写.....

因为hibernate查询时候找的是对象,对象对应的类名映射到数据库中的表,from 类(表)或者属性(列),脑补一下xml配置,而不是直接from 表名.

oh my god一个小时就浪费在这种蠢事上了,所以代码编辑的时候一定要动脑后动手,而不是晕乎乎的敲或者复制粘贴,海燕那,你就长点儿心吧!

 

转载于:https://www.cnblogs.com/FieryYouth/p/5541605.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值