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

hibernate中HQL练习时候一个小小的错误导致语法异常的更多相关文章

  1. 在Hibernate中使用Memcached作为一个二级分布式缓存

    转自:http://www.blogjava.net/xmatthew/archive/2008/08/20/223293.html   hibernate-memcached--在Hibernate ...

  2. 一个mybatis错误导致无法启动项目的问题

    今天遇到Mybatis一个问题,导致项目一直起不来,查了很久发现是MapperXML的错,问题表现为: 系统始终起不来,但也不报错,始终卡到如下信息位置: 信息: Initializing Sprin ...

  3. 代码中会话同步(同步redis)导致的异常问题

    背景: 第一天拷贝了一份tomcat(配置了redis会话同步),部署了erp-rocketmq应用(用作给顾客发送消息).            第二天早晨,整个erp系统出现异常情况: 1> ...

  4. Hibernate中HQL的日期差值计算,可计算相差多少秒

    最近有个业务需求就是计算订单创建时间离现在超过 4 小时的订单都查找出来! 那么就需要用到日期函数了. 网上找了一下总共的日期函数有一下几个: CURRENT_DATE() 返回数据库当前日期 时间函 ...

  5. Hibernate中Hql查询

    这篇随笔将会记录hql的常用的查询语句,为日后查看提供便利. 在这里通过定义了三个类,Special.Classroom.Student来做测试,Special与Classroom是一对多,Class ...

  6. hibernate中HQL多对多的查询

    现有三张表 TLXPURCHASE.采购事项审批表,TLXPURCHASEACTIVITY.采购招标活动对应表,TLXACTIVITY.招标活动表,采购事项审批表和采购活动表是多对多关系.java中定 ...

  7. Hibernate 中Hql 查询中间表的用法

    案例简述: 项目中存在User 用户表 和 Role 角色表 它们之间是多对多的关系 在User类定义中 使用hibernate注解 //角色列表 @ManyToMany(targetEntity = ...

  8. Hibernate中HQL函数汇总及获取当前时间进行比较举例

    在很多时候,我们负责的项目中,在数据访问层(DAO层)通常我们会使用sql语句或者hql语句,而在我们使用hql语句拼接时有时会报错,通常的原因是:我们使用了标准的sql语句,开启的确是hiberna ...

  9. hibernate 中HQL查询

    由于比较简单,在此处只写一些HQL语言. 表关系,多对一. CREATE TABLE `user` ( `id` ) NOT NULL AUTO_INCREMENT, `uname` varchar( ...

随机推荐

  1. Asp.net 面向接口可扩展框架之类型转化基础服务

    新框架正在逐步完善,可喜可贺的是基础服务部分初具模样了,给大家分享一下 由于基础服务涉及面太广,也没开发完,这篇只介绍其中的类型转化部分,命名为类型转化基础服务,其实就是基础服务模块的类型转化子模块 ...

  2. python中global 和 nonlocal 的作用域

    python引用变量的顺序: 当前作用域局部变量->外层作用域变量->当前模块中的全局变量->python内置变量 . 一 global global关键字用来在函数或其他局部作用域 ...

  3. patch 打补丁,和diff 生成制作补丁

    一.diff 命令: diff命令就是比较两个文件的差异,然后生成差异文件,即补丁文件. 参数:diff --help获得,最常用的 1.-N --new-file 在比较时,如果没有就拿一个空的文件 ...

  4. 【HTML】 frame和iframe的区别

    1.frame不能脱离frameSet单独使用,iframe可以: 2.frame不能放在body中:如下可以正常显示: <!--<body>--> <frameset ...

  5. 滚动变色的文字js特效

    Js实现滚动变色的文字效果,在效果展示页面,可看到文字在交替变色显示,以吸引人的注意,效果真心不错哦,把代码拷贝到你的网站后,修改成想要的文字就OK了. 查看效果:http://keleyi.com/ ...

  6. IIS6.0添加上.net4.0后,以前的.net系统出现“服务器应用程序不可用”的错误提示解决办法

    把VS2010开发的网站.net4.0部署到Windows Server 2003的服务器上去, Windows Server 2003操作系统自带的为IIS 6.0,IIS 6.0一般只支持.NET ...

  7. MySQL基础(非常全)

    MySQL基础 一.MySQL概述 1.什么是数据库 ? 答:数据的仓库,如:在ATM的示例中我们创建了一个 db 目录,称其为数据库 2.什么是 MySQL.Oracle.SQLite.Access ...

  8. UIPickerView的使用(二)

    上篇文章 UIPickerView的使用(一)学习了如何创建单列选择器,现在看一下如何创建多列选择器 多列选择器(以二列为例) 1.遵守协议和创建两个数据源 2.创建pickView 3.实现代理 / ...

  9. Linux下tar-rar-unrar解压/压缩缩命令大全

    转载请标明出处: http://www.cnblogs.com/why168888/p/5975559.html 本文出自:[Edwin博客园] RAR文件下载:http://www.rarlab.c ...

  10. Android Studio 恢复小窗口停靠模式(Docked Mode)

    安卓studio在使用小窗口时,如果我们点击取消了窗口的docked mode模式,窗口就会变成,你一旦触发窗口以外的区域,窗口就会龟缩回去.此时,如果你想要恢复回原来的docked mode的话,具 ...