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( ...
随机推荐
- Ado.net[登录,增删改查,Get传值,全选,不选,批量删除,批量更新]
[虽然说,开发的时候,我们可以使用各种框架,ado.net作为底层的东西,作为一个合格的程序员,在出问题的时候我们还是要知道如何调试] 一.增删改查 cmd.ExecuteReader();执行查询, ...
- SqlServer-无限递归树状图结构设计和查询
在现实生活中,公司的部门设计会涉及到很多子部门,然后子部门下面又存在子部门,形成类似判断的树状结构,比如说评论楼中楼的评论树状图,职位管理的树状图结构等等,实现类似的树状图数据结构是在开发中经常出现的 ...
- PHP流程控制之循环结构
计算机程序最擅长的功能之一就是按规定的条件,重复执行某些操作.循环结构可以减少源程序重复书写的工作量,即在给定条件成立时,反复执行某程序段,直到条件不成立为止.给定的条件称为循环条件,反复执行的程序段 ...
- js 之 continue break return 用法及注意事项
1,continue continue有两种用法: 1,continue; 这种用法必须包含在循环里,否则报错,例子: for(var i=0;i<10;i++){ if(i%2===0){ c ...
- angular源码分析:angular中$rootscope的实现——scope的一生
在angular中,$scope是一个关键的服务,可以被注入到controller中,注入其他服务却只能是$rootscope.scope是一个概念,是一个类,而$rootscope和被注入到cont ...
- iOS笔记之NSSet
一.简介 NSSet到底什么类型,其实它和NSArray功能性质一样,用于存储对象,属于集合: NSSet , NSMutableSet类声明编程接口对象,无序的集合,在内存中存储方式是不连续的, ...
- 基本排序算法——基数排序java实现
基数排序 package basic.sort; import java.util.Arrays; import java.util.Random; public class RadixSort { ...
- 网络分析之Pgrouting(转载)
网上关于Pgrouting的使用介绍太简单了,这里想详细的总结一下Pgrouting的使用,其实主要参照官方文档:http://workshop.pgrouting.org/ 第一步:配置环境 关于P ...
- Android UI ListView的使用
一.ListView的理解 1.什么ListView? 一种用来显示多个可滑动项(Item)列表的的ViewGroup 需要使用Adapter将集合数据和每一个Item所对应的布局动态适配到Li ...
- iOS 学习 - 21 系统自带解析 XML
准备工作: new -> file -> other -> Empty ,在 Save As: 中随便起个名字后缀为 .xml 拷贝下面 <person> <stu ...