Hibernate插入、查询、删除操作 HQL or SQL
2012-02-29 10:42
405 查看
http://adoze.bokee.com/viewdiary.25672393.html
=====
public Collection findBySQL(String sql){
Session session = null;
Transaction tran = null;
Collection list = null;
try {
session = sessionFactory.openSession();
tran = session.beginTransaction();
SQLQuery sq = session.createSQLQuery(sql);
sq.addEntity(Student.class);
list = sq.list();
tran.commit();
} catch (HibernateException e) {
e.printStackTrace();
tran.rollback();
}finally{
if(session!=null)
session.close();
}
return list;
}
直接用SqlQuery好像不能直接执行 增 删 改 操作,不过,我找了一下,下面的方法可以的。
trans = session.beginTransaction();
Connection conn = session.connection();
PreparedStatement stmt = conn.prepareStatement(sql);
stmt.executeUpdate();
stmt.execute();
trans.commit();
Hibernate的所有的操作都是通过Session完成的. 基本步骤如下: 1:通过配置文件得到SessionFactory: SessionFactory sessionFactory=new Configuration().configure().buildSessionFactory(); 2:通过SessionFactory 得到一个Session Session session=sessionFactory.openSession(); 3:通过session进行插入,删除,修改以及查询. 插入例子:(1)声明一个事务;(2)Session执行save()操作;(3)事务提交;(4)关闭Session,可选. public void insert(Person p){ Transaction tran=session.beginTransaction(); session.save(p); tran.commit(); // session.close(); } 修改例子:(1)声明一个事务;(2)Session执行update()操作;(3)事务提交;(4)关闭Session,可选. public void update(Person p){ Transaction tran=session.beginTransaction(); session.update(p); tran.commit(); // session.close(); } 删除例子(主键删除,推荐使用):(1) 声明删除的SQl语句;(2)创建session的Query对象;(3)设置Query对象的参数;(4)执行Query的executeUpdate()操作;(5)Session事务提交 public void delete(int id){ String hql="delete Person as p where p.id=?"; Query query=session.createQuery(hql); query.setInteger(0,id); query.executeUpdate(); session.beginTransaction().commit(); } 删除例子(对象删除):(1)声明一个事务;(2)Session执行delete()操作;(3)事务提交;(4)关闭Session,可选. public void delete(Person p){ Transaction tran = session.beginTransaction(); session.delete(p); tran.commit(); session.close(); } 查询例子:(跟删除差不多) 查询语句不需要事务提交 (1) 声明删除的SQl语句;(2)创建session的Query对象;(3)设置Query对象的参数; public Persion queryById(int id){ String hql="from Person as p where p.id=?"; Query query=session.createQuery(); query.setInteger(0,id); List rsList=query.list(); iterator it=rsList.iterator(); Person person=null; while(it.haseNext()){ person=(Person)it.next(); } return person; } session.delete()- - session.delete(obj)将obj的状态变为transient。两种情况 1)obj是session的cache里边的cache没有的,比如: session.delete(new Employee(4)); 2)obj存在于session的cache中,比如: Employee employee = (Employee)session.load(Employee.class, new Integer(4)); session.delete(employee); 这两种情况都是允许的,hibernate都会发送一条delete语句给数据库。 delete执行之后,如果调用了session.load(), 又可以分为两种情况: 1)在session.flush()之前,如: tx.beginTransaction(); session.delete(new Employee(4)); session.load(Employee.class, new Integer(4));//发生在session.flush()之前 tx.commit(); 那么hibernate会抛出ObjectDeletedException:The object with that id was deleted: 2)在session.flush()之后,如: tx.beginTransaction(); session.delete(new Employee(4)); session.load(Employee.class, new Integer(4)); tx.commit(); tx.beginTransaction(); session.load(Employee.class, new Integer(4));//同一个session中,上面的tx.commit()将session flush了一次。 tx.commit(); 那么这个时候hibernate仅仅会抛出ObjectNotFoundException:No row with the give... 表示找不到该object。如果第二个tx里边采用session.get()也就不会抛出exception了。 delete执行之后,如果调用了session.save(obj): tx.beginTransaction(); Employee employee = (Employee)session.load(Employee.class, new Integer(4)); session.delete(employee); System.out.println(employee); session.save(employee); System.out.println(employee); tx.commit(); 这种情况是完全合理的,合法的, delete将employee从persistent的状态变为transient的状态。 save将employee从transient状态变为persistent的状态。 save一个被delete的obj的时候,在save处hibernate强制执行session.flush(),发送delete语句,然后按照常规的save流程来进行。为什么要这么做,还没有完全想明白。 delete执行之后,如果对obj对象属性的修改,tx.commit()时不会进行dirtyChecking。 这个道理比较显然,这些思想不是完全正确的,还是要更具自己的实际的情况来看到底是怎么一回事.这个记录是在别人那里抄来的,当时都没有想太多,所以犯了很多错误,但是后来的时候还是给了我很大的帮助,至少我的问题给我解决了,只是换了一种方式!所以我还是很感谢这位朋友所以把这个帖出来! |
public Collection findBySQL(String sql){
Session session = null;
Transaction tran = null;
Collection list = null;
try {
session = sessionFactory.openSession();
tran = session.beginTransaction();
SQLQuery sq = session.createSQLQuery(sql);
sq.addEntity(Student.class);
list = sq.list();
tran.commit();
} catch (HibernateException e) {
e.printStackTrace();
tran.rollback();
}finally{
if(session!=null)
session.close();
}
return list;
}
直接用SqlQuery好像不能直接执行 增 删 改 操作,不过,我找了一下,下面的方法可以的。
trans = session.beginTransaction();
Connection conn = session.connection();
PreparedStatement stmt = conn.prepareStatement(sql);
stmt.executeUpdate();
stmt.execute();
trans.commit();
相关文章推荐
- Hibernate插入、查询、删除操作 HQL (转)
- Hibernate插入、查询、删除操作 HQL
- Hibernate插入、查询、删除操作 HQL
- Hibernate插入、查询、删除操作 HQL
- Hibernate HQL插入、查询、删除操作
- Hibernate学习-07:CRUD(增删改查)操作之查询多条/所有记录HQL、QBC、SQL三种方式
- hibernate实现查询,修改,插入,删除操作
- hibernate插入,查询,删除等操作
- SQL 单表查询的一些常用语句和函数及单表的插入修改删除操作
- Hibernate插入、查询、删除操作
- Hibernate插入、查询、删除操作
- Hibernate中关于多表连接查询hql 和 sql 返回值集合中对象问题
- Hibernate HQL查询 插入 更新(update)实例
- 实现用SQL语句分页查询操作hibernate
- hibernate查询方式:HQL、SQL、Criteria方法、命名、动态分离查询、例子查询
- shell脚本操作mysql数据库—创建数据库,在该数据库中创建表(插入,查询,更新,删除操作也可以做)
- Hibernate-HQL、Criteria、SQL实现查询对照以及增删改
- C#操作SQLite数据库方法小结(创建,连接,插入,查询,删除等)
- Hibernate学习37 -- Hibernate查询语言(HQL)11 -- DML风格的操作
- 在ASP.NET 2.0中操作数据之四十七:用SqlDataSource控件插入、更新、删除数据