hibernate中HQL练习时候一个小小的错误导致语法异常
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练习时候一个小小的错误导致语法异常的更多相关文章
- 在Hibernate中使用Memcached作为一个二级分布式缓存
转自:http://www.blogjava.net/xmatthew/archive/2008/08/20/223293.html hibernate-memcached--在Hibernate ...
- 一个mybatis错误导致无法启动项目的问题
今天遇到Mybatis一个问题,导致项目一直起不来,查了很久发现是MapperXML的错,问题表现为: 系统始终起不来,但也不报错,始终卡到如下信息位置: 信息: Initializing Sprin ...
- 代码中会话同步(同步redis)导致的异常问题
背景: 第一天拷贝了一份tomcat(配置了redis会话同步),部署了erp-rocketmq应用(用作给顾客发送消息). 第二天早晨,整个erp系统出现异常情况: 1> ...
- Hibernate中HQL的日期差值计算,可计算相差多少秒
最近有个业务需求就是计算订单创建时间离现在超过 4 小时的订单都查找出来! 那么就需要用到日期函数了. 网上找了一下总共的日期函数有一下几个: CURRENT_DATE() 返回数据库当前日期 时间函 ...
- Hibernate中Hql查询
这篇随笔将会记录hql的常用的查询语句,为日后查看提供便利. 在这里通过定义了三个类,Special.Classroom.Student来做测试,Special与Classroom是一对多,Class ...
- hibernate中HQL多对多的查询
现有三张表 TLXPURCHASE.采购事项审批表,TLXPURCHASEACTIVITY.采购招标活动对应表,TLXACTIVITY.招标活动表,采购事项审批表和采购活动表是多对多关系.java中定 ...
- Hibernate 中Hql 查询中间表的用法
案例简述: 项目中存在User 用户表 和 Role 角色表 它们之间是多对多的关系 在User类定义中 使用hibernate注解 //角色列表 @ManyToMany(targetEntity = ...
- Hibernate中HQL函数汇总及获取当前时间进行比较举例
在很多时候,我们负责的项目中,在数据访问层(DAO层)通常我们会使用sql语句或者hql语句,而在我们使用hql语句拼接时有时会报错,通常的原因是:我们使用了标准的sql语句,开启的确是hiberna ...
- hibernate 中HQL查询
由于比较简单,在此处只写一些HQL语言. 表关系,多对一. CREATE TABLE `user` ( `id` ) NOT NULL AUTO_INCREMENT, `uname` varchar( ...
随机推荐
- Atitit.异常处理 嵌套 冗长的解决方案
Atitit.异常处理 嵌套 冗长的解决方案 1. 异常处理的需要改进的地方1 2. +异常设计的初衷是, 在程序中出现错误时, 由程序自己处理错误, 尽量不要以exit(0)这种粗暴的方式中止程序 ...
- CSS制作凹环特效
就是在地面上打凿出凹的圆环效果,利用linear-gradient线性渐变增强内环质感,再用伪类after元素设置中心圆凸块的位置以及大小与跟内环之间的阴影度,然后设置内环的颜色就行了:第四个环上面的 ...
- JS学习笔记10之Math对象
-->Math对象 常用属性和方法-->使用Math对象制作相应的效果 Math对象用于执行数学任务 一.Math对象的属性: 二.Math对象的方法: 三.常用属性和方法: Math.P ...
- yum使用点滴
yum下载依赖rpm包 先安装一个yum-downloadonly 1 yum install yum-downloadonly完成安装后,yum –help在最后就提示两个命令参数,分别是: Plu ...
- Android-socket服务端断重启后,android客户端自动重连
今天研究这个问题搞了整整一天啊!终于出来了,不过我没有多大的成就感,为什么呢?因为这不是我的劳动成果.同样的问题,我却没想出来!心塞的很啊…… 不过还是要给大家分享一下,希望给大家带来帮助! 先声明一 ...
- UITableViewHeaderFooterView的封装
UITableViewHeaderFooterView的封装 特点 1. 封装的 UITableViewHeaderFooterView 能够让用户更好的自定义自己的 headerView; 2. 封 ...
- [转]给 C# 开发者的代码审查清单
这是为C#开发者准备的通用性代码审查清单,可以当做开发过程中的参考.这是为了确保在编码过程中,大部分通用编码指导原则都能注意到.对于新手和缺乏经验(0到3年工作经验)的开发者,参考这份清单编码会很帮助 ...
- 简单的学习心得:网易云课堂Android开发第三章自定义控件
这一章分三部分: (1)自定义控件:老师先简单讲解了一些细节,如为什么不用px,而要用dp,只因机型的屏幕分辨率不同,用px会导致差异太大.然后演示了制作自定义控件的步骤,先在xml文件中添加对应的自 ...
- iOS UIPageViewController缺陷
为什么弃用UIPageViewController?问题1:设置UIPageViewController为UIPageViewControllerTransitionStyleScroll且调用set ...
- LruCache缓存
LruCache通常用于实现内存缓存,采用的缓存算法是LRU(Least Recently Used)即近期最少使用算法,其核心思想是:当缓存满的时候,会优先淘汰那些近期最少使用的缓存对象. 1.Lr ...