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. 基于CkEditor实现.net在线开发之路(5)列表页面开发

    这章主要讲解利用控件开发列表页面,我们先从最简单的列表页面开始讲解,这个列表只有一个列表展示.具体开发步骤请看下面动态图 由上动态图可以看出,开发一个简单的列表只有两步, 第一步:拖拽查询控件,设置好 ...

  2. 微信JSApi支付~集成到MVC环境后的最后一个坑(网上没有这种解决方案)

    返回目录 大叔第一人 之前写了关于微信的坑<微信JSApi支付~坑和如何填坑>,今天将微信的jsapi支付封装到了MVC环境里,当然也出现了一些新的坑,如支付参数应该是Json对象而不是J ...

  3. C++_系列自学课程_第_4_课_string_《C++ Primer 第四版》

    相信学习过计算机编程的人,基本应该都接触过C语言,在C语言中处理字符串大家一定多遇到过, 也都知道处理字符串非常麻烦,而在C++里面,由标准库string类提供对可变长的字符串的支持.下面 来看看st ...

  4. (Spring4 json入门)Spring4+SpringMVC+页面数据发送与接收(json格式)

    jar包(Maven仓库): Spring4 jar包(Maven仓库): 在测试过程中我查看了网上的一些教程,但是那些教程都是在Spring3环境下的,Spring3和Spring4解析json需要 ...

  5. Atitit.ide eclipse编译速度慢的解决

    Atitit.ide eclipse编译速度慢的解决 以为是jar的体积与数量,貌似无关.. Err java的数量,貌似无关 Java的数量,关系不大... 最终原因:show>>pro ...

  6. PHP工作笔记:使用yii migrate管理、生成数据库

    第一步:进入yii migrate 通过dos(我是win7系统,其他系统类似,就是进入字符界面)打开网站目录 phpStudy/WWW/local/ddc_dlss 输入 ./yii migrate ...

  7. MongoDB分片(sharding)

    1.概念 分片(sharding)是指将数据拆分,将其分散存在不同的机器上的过程.有时也用分区(partitioning)来表示这个概念.将数据分散到不同的机器上,不需要功能强大的大型计算机就可以储存 ...

  8. Netty(一)引题

    本文介绍Java BIO(同步阻塞IO),伪异步IO,NIO(非阻塞IO),AIO(异步IO)这四种IO的情况,并对不同IO模型作比较. 目录 1.BIO 2.伪异步IO 3.NIO 4.AIO 5. ...

  9. MyBatis的getMapper()接口、resultMap标签、Alias别名、 尽量提取sql列、动态操作

    一.getMapper()接口 解析:getMapper()接口 IDept.class定义一个接口, 挂载一个没有实现的方法,特殊之处,借楼任何方法,必须和小配置中id属性是一致的 通过代理:生成接 ...

  10. JS高程3.基本概念(6)函数

    1.ECMAScript中的函数使用function关键字来声明. eg: function sum (num1,num2){ alert(num1+num2); } sum(3,7); 注意: 在有 ...