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

时间:2022-02-02 03:53:34
 package cn.db.po.test;

 import java.util.List;

 import cn.db.po.User;
import cn.db.po.biz.UserBiz; public class TestFirstHib {
public static void main(String[] args) {
//创建一个新用户
//User user=new User();
//user.setId(1001);
/*
* 删除的时候只要给后台传ID便可
* user.setName("accp");
user.setPassword("1111");
user.setTelephone("1341212");
user.setUserName("加多宝");*/ //增加(保存)方法
UserBiz ub=new UserBiz();
/*ub.addNewUser(user);
System.out.println("add seccess");*/ //查询方法
/*user = ub.getUser(3);
System.out.println("查询结果:"+user.getUserName());*/ //更新方法
/*ub.updateUser(user);
user = ub.getUser(4);
System.out.println("update success"+user.getUserName());*/ /**
* 测试saveOrUpdate.如果不给指定ID则直接增加一行;
* 如果给定ID则先查询数据库有没有这一列,没有则执行更新
*/
//ub.saveOrUpdateBiz(user); //动态更新底层机制理解版本
/*ub.dynamicUpdate(user);*/ //删除方法测试
//ub.delete(user); //因为现在没有提供参数所以括号里面写null
List<User> list = ub.findUsers(null); for (User u: list)
System.out.println("users对象名="+u.getName()); }
}

测试类

 package cn.db.po.biz;

 import java.util.List;

 import org.hibernate.HibernateException;
import org.hibernate.Transaction; import cn.db.po.User;
import cn.db.po.common.HibernateSessionFactory;
import cn.db.po.dao.UserDao; public class UserBiz {
private UserDao dao = new UserDao(); public void addNewUser(User user) {
Transaction tx = null;// 定义事务处理对象 // 通过会话开启事务,拿到的是唯一的属于自己的会话getSession()会调用getCurrentSession()
try {
// 1.获得会话并开启事务
tx = HibernateSessionFactory.getSession().beginTransaction();
dao.save(user);// 2.调Dao的方法
tx.commit();// 3.提交
} catch (HibernateException e) {
if (tx != null) {
tx.rollback();// 4.失败回滚
}
}
// getCurrentSession()不管提交成功还是失败回滚都会自动关闭连接
} // 按ID查询
public User getUser(java.io.Serializable id) {
Transaction tx = null;
User user = null;
try {
// 1.获得会话并开启事务
tx = HibernateSessionFactory.getSession().beginTransaction();
user = dao.findById(id);
tx.commit();// 3.提交
} catch (HibernateException e) {
if (tx != null) {
tx.rollback();// 4.失败回滚
}
} return user;
} // 更新操作
public void updateUser(User user) {
Transaction tx = null; try {
// 1.获得会话并开启事务
tx = HibernateSessionFactory.getSession().beginTransaction();
dao.update(user);
tx.commit();// 3.提交
} catch (HibernateException e) {
if (tx != null) {
tx.rollback();// 4.失败回滚
}
}
} public void saveOrUpdateBiz(User user) {
Transaction tx = null; try {
// 1.获得会话并开启事务
tx = HibernateSessionFactory.getSession().beginTransaction();
dao.saveOrUpdateDemo(user);
tx.commit();// 3.commit=flash()+commit();提交触发脏检查
} catch (HibernateException e) {
if (tx != null) {
tx.rollback();// 4.失败回滚
}
}
} // 业务层的动态更新方法
public void dynamicUpdate(User user) {
Transaction tx = null; try {
tx = HibernateSessionFactory.getSession().beginTransaction();
dao.dynamicUpdate(user);
tx.commit();
} catch (HibernateException e) {
if (tx != null) {
tx.rollback();
}
}
} // 业务层的删除方法
public void delete(User user) {
Transaction tx = null;// 首先定义事务处理对象 try {
tx = HibernateSessionFactory.getSession().beginTransaction();
dao.delete(user);
tx.commit();
} catch (HibernateException e) {
if (tx != null) {
tx.rollback();
}
} } // HQL查询演示视频上传直接复制写的,传的参数没管.??为什么?
public List<User> findUsers(User user) {
Transaction tx = null;
List<User> list = null; try {
tx = HibernateSessionFactory.getSession().beginTransaction();
list = dao.findUser();
tx.commit();
} catch (HibernateException e) {
e.printStackTrace();
if (tx != null) {
tx.rollback();
}
}
return list;
}
}

业务层

 package cn.db.po.dao;
//dao层开始测试
import java.util.List; import org.hibernate.Query; import cn.db.po.User;
import cn.db.po.common.HibernateSessionFactory; public class UserDao {
//hibernate添加的方法1
public void save(User user){
HibernateSessionFactory.getSession().save(user);
} /**
* hibernate添加的方法2
* 添加和更新很相似,干脆合并成一个方法了.就是说前台传过一个对象来,发现有变化就更新没变化就保存
*/
public void saveOrUpdateDemo(User user){
HibernateSessionFactory.getSession().saveOrUpdate(user);
} //查询。按主键查询时传参 传实现的接口,User.class表示返回这个类的信息
public User findById(java.io.Serializable id){
return (User)HibernateSessionFactory.getSession()
.get(User.class, id); /**
* 还有一个load()方法也是查询,使用、传参和get()一样的但是机制不一样.
* 1.load是延迟加载。如果想实现个get一样的机制要在xml属性里面加lazy="false"
* 2.get()查询到id是空时返回null,load()则直接报错;
*/
} //hibernate更新的方法1
public void update(User user){ HibernateSessionFactory.getSession().update(user); } //hibernate动态更新演示
public void dynamicUpdate(User user){ /*1.//(动态更新底层机制理解版本)
*
* User u=(User)HibernateSessionFactory.getSession().get(User.class, user.getId());
* 检查的时候hibernate同时也得到了一个快照
User u=(User)HibernateSessionFactory.getSession().get(User.class, user.getId());
*//**
* 首先ID不能动.
* 从传过来的user对象里面取到的值赋值给查出来的u;user里面封装的是希望变成的值,
* u里面是从数据库拿到的值.
* 也就是相当于从数据库拿出来的时候拍了张快照,然后接着set用新值填充。接下来提交事务便可.
* hibernate会先查询看哪里变化了,如果没有变化什么都不做;
*
*//*
u.setName(user.getName());
u.setPassword(user.getPassword());
u.setIsAdmin(user.getIsAdmin());
u.setTelephone(user.getTelephone());
u.setUserName(user.getUserName());*/
//这时脏数据就产生了 //2.简洁化后的merge()方法,实现原理和底层笨的方法是一样的.
HibernateSessionFactory.getSession().merge(user); } //删除
public void delete(User user){
//hibernate建议先查询,根据返回的id来删除
//User u=(User)HibernateSessionFactory.getSession().get(User.class, user.getId());
//HibernateSessionFactory.getSession().delete(u); /**
* 也可以根据用户对象来删除,前提是测试类中有指定id(也就是执行的时候给数据库指定一个id),
* 以及映射配置文件中的映射列不能有非空条件存在
*/
HibernateSessionFactory.getSession().delete(user); } /*//该方法是举例演示不执行:持久化所有对象,为了防止内存堵塞,每持久化20个对象进行一次缓存清理和清空
public void saveAll(List<User> users){ for (int i = 0; i < users.size(); i++) {
HibernateSessionFactory.getSession().save(users);
if (i%20==0) {
HibernateSessionFactory.getSession().close();
HibernateSessionFactory.getSession().clear();
}
} }*/ //HQL查询
public List<User> findUser(){ //根据语句创建一个Query的实例
Query q = HibernateSessionFactory.getSession()
.createQuery("from user"); return q.list();
} }

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