Query对象的list()和iterate()方法的执行效率问题iterate方法使用select查询所有id字段的值,然后在缓存中寻找匹配的对象如果在缓存中没有,则通过额外的select语句根据id值从表中获得该对象。最好的执行效率如下方式编码:
public void printProduct(){
Session session=HibernateUtil.getSession();
Transaction tx=null;
Product product=null;
try{
tx=session.beginTransaction();
String hql="from Product";
Query query=session.createQuery(hql);
List<Product>list=query.list();
Iterator<Product>it=query.iterate();
while(it.hasNext()){
product=it.next();
System.out.println(product.getName()+" "+product.getDescription());
}
tx.commit();
}catch(Exception e){
tx.rollback();
e.printStackTrace();
}finally{
HibernateUtil.closeSession(session);
}
}
先获得list对象把所有对象保存在缓存中,然后有iterate()方法匹配查找,达到最佳效率。
Quer对象的三个方法setFirstResult(),setMaxResult(),uniqueResult()方法可以实现分页,setFirstResult确定分页显示的首条元素,setMaxResult设置每页显示的记录数,uniqueResult用户获得指定的记录:确实首行为指定记录,设置最大记录为1 调用uniqueResult方法获得该对象,向下造型即可获得指定记录所对应对象
tx.commit()的位置一定要注意,应该放在所有逻辑处理的最后,否则又要开启新的事物和会话
public class ProductDaoImpl implements ProductDao {
public void printMutl(){
Session session=HibernateUtil.getSession();
Transaction tx=null;
try{
tx=session.beginTransaction();
String hql="select name,price from Product";
Query query=session.createQuery(hql);
List<Object[]>list=query.list();
for(Object[]obj:list){
System.out.println(obj[0]+" "+obj[1]);
}
tx.commit();//事务提交的位置应该在所有业务处理的最后否则后续的处理需要再次开启事务和会话。
}catch(Exception e){
tx.rollback();
e.printStackTrace();
}finally{
HibernateUtil.closeSession(session);
}
}
控制翻转,一般将控制交给少的一方来完成,设置cascade=“sava-update”这样在保存少的一方时会自动保存多的一方,不用在将少的一方添加到数据库中,这样反而是数据库中的数据重复添加。
Group by子句后面可以跟其他子句但是接其他子句时 group by子句的表达式必须是使用别名的,在后面的其他子句中最好也使用别名加属性的形式。
注意删除语句的写法
String hql=”delete product where id<50”;
Query query=session.createQuery(hql);
Int rowCount=Query.executeUpdate();
Tx.commit;