分类:
2008-09-09 17:10:19
一。hibernate 实现分页如果需要指定结果集的范围(希望返回的最大行数/或开始的行数),应该使用Query接口提供的方法。 Hibernate 知道如何将这个有限定条件的查询转换成数据库的原生SQL Session session = HibernateSessionFactory.getSession(); Query query = session.createSQLQuery("select * from student");// sql query.setFirstResult(2); query.setMaxResults(1);
query.setFirstResult(2); 开始的行
query.setMaxResults(1);返回的最大行
从第2行开始 返回1行
二。 对象- 绑定参数查询
接口Query提供了对命名参数(named parameters)、JDBC风格的问号(?)参数进行绑定的方法。 不同于JDBC,Hibernate对参数从0开
始计数。 命名参数在查询字符串中是形如:name的标识符,优点是: 命名参数(named parameters)与其在查询串中出现的顺序无关 它们可在同一查询串中多次出现 它们本身是自我说明的
三。 如果JDBC支持可滚动的ResuleSet,Query接口使用ScrollableResults,允许在查询结果中灵活移动。
四。对象-使用原生SQL的查询
可以使用createSQLQuery()方法,用SQL来描述查询,并由Hibernate处理将结果集转换成对象的工作。注意:可以在任何时候调用session.connection()来获得并使用JDBC Connection对象。 如果选择使用Hibernate的API, 你必须把
SQL别名用大括号包围起来。
五。对象-自动状态检测
saveOrUpdate()用途和语义可能会使新用户感到迷惑。 首先,只要没有试图在某个session中使用来自另一session的实例,就不需要使用update(), saveOrUpdate(),或merge()。通常下面的场景会使用update()或saveOrUpdate(): 程序在第一个session中加载对象 该对象被传递到表现层 对象发生了一些改动 该对象被返回到业务逻辑层 程序调用第二个session的update()方法持久这些改动 saveOrUpdate()做下面的事: 如果对象已经在本session中持久化了,不做任何事 如果另一个与本session关联的对象拥有相同的持久化标识(identifier),抛出一个异常 如果对象没有持久化标识(identifier)属性,对其调用save() 如果对象的持久标识(identifier)表明其是一个新实例化的对象,对其调用save() 如果对象是附带版本信息的(通过
每间隔一段时间,Session会执行一些必需的SQL语句来把内存中的对象的状态同步到JDBC连接中。这个过程被称为刷出(flush),默认会在下面的时间点执行: 在某些查询执行之前 在调用org.hibernate.Transaction.commit()的时候 在调用Session.flush()的时候 涉及的SQL语句会按照下面的顺序发出执行: 所有对实体进行插入的语句,其顺序按照对象执行Session.save()的时间顺序 所有对实体进行更新的语句 所有进行集合删除的语句 所有对集合元素进行删除,更新或者插入的语句 所有进行集合插入的语句 所有对实体进行删除的语句,其顺序按照对象执行Session.delete()的时间顺序 (有一个例外是,如果对象使用native方式来生成ID(持久化标识)的话,它们一执行save就会被插入。)