Hibernate查询的各种方式效率比较

查询已知表名的实体时推荐使用getHibernateTemplate().executeWithNativeSession() + SQLQuery方式。

 

以下测试使用JUnit进行,仅查询一次,查询结果为5条记录。各种方式的详细代码及执行时间如下所示:

 

方式1,正常getHibernateTemplate().find()方式(183ms):

  1. List list = getHibernateTemplate()  
  2. .find(  
  3. "select o.id from  SfmFileIndex o where o.bussNo = ? and o.typePath = ? and o.validStatus = ? order by o.uploadTime",  
  4. new Object[] { bussNo, typePath, "1" });  
 

方式2,使用getHibernateTemplate().execute() + Query方式(214ms):

  1. List list = (List) getHibernateTemplate().execute(  
  2.         new HibernateCallback() {  
  3.             public Object doInHibernate(Session session)  
  4.                 throws HibernateException, SQLException {  
  5.                 Query query = session.createQuery("select o.id from  SfmFileIndex o where o.bussNo = ? and o.typePath = ? and o.validStatus = ? order by o.uploadTime");  
  6.                 query.setParameter(0, bussNo);  
  7.                 query.setParameter(1, typePath);  
  8.                 query.setParameter(2"1");  
  9.                 return query.list();  
  10.             }  
  11.         });  
 

方式3,使用getHibernateTemplate().executeWithNativeSession() + Query方式(184ms):

  1. List list = (List) getHibernateTemplate().executeWithNativeSession(  
  2.         new HibernateCallback() {  
  3.             public Object doInHibernate(Session session)  
  4.                     throws HibernateException, SQLException {  
  5.                  Query query = session  
  6.                         .createQuery("select o.id from  SfmFileIndex o where o.bussNo = ? and o.typePath = ? and o.validStatus = ? order by o.uploadTime");  
  7.                 query.setParameter(0, bussNo);  
  8.                 query.setParameter(1, typePath);  
  9.                 query.setParameter(2"1");  
  10.                 return query.list();  
  11.             }  
  12.         });  
 

方式4,使用getHibernateTemplate().execute() + SQLQuery方式(102ms):

  1. List list = (List) getHibernateTemplate().execute(  
  2.             new HibernateCallback() {  
  3.                         public Object doInHibernate(Session session)  
  4.                                 throws HibernateException, SQLException {  
  5.                             SQLQuery query = session  
  6.                                     .createSQLQuery("select o.id from  Sfm_FileIndex o where o.bussNo = ? and o.typePath = ? and o.validStatus = ? order by o.uploadTime");  
  7.                             query.setParameter(0, bussNo);  
  8.                             query.setParameter(1, typePath);  
  9.                             query.setParameter(2"1");  
  10.                             return query.list();  
  11.                         }  
  12.                     });  
 

方式5,使用getHibernateTemplate().executeWithNativeSession() + SQLQuery方式(68ms):

[c-sharp] view plain copy print ?
  1. List list = (List) getHibernateTemplate().executeWithNativeSession(  
  2.         new HibernateCallback() {  
  3.             public Object doInHibernate(Session session)  
  4.                     throws HibernateException, SQLException {  
  5.                 SQLQuery query = session  
  6.                         .createSQLQuery("select o.id from  Sfm_FileIndex o where o.bussNo = ? and o.typePath = ? and o.validStatus = ? order by o.uploadTime");  
  7.                 query.setParameter(0, bussNo);  
  8.                 query.setParameter(1, typePath);  
  9.                 query.setParameter(2, "1");  
  10.                 return query.list();  
  11.             }  
  12.         });  
 

方式6,使用JDBC (用于比较,代码不够健壮)(37ms):

  1. PreparedStatement ps = getSession()  
  2. .connection()  
  3. .prepareStatement(  
  4. "select o.id from sfm_fileindex o where o.bussNo = ? and o.typePath = ? and o.validStatus = ? order by o.uploadTime");  
  5. ps.setString(1, bussNo);  
  6. ps.setString(2, typePath);  
  7. ps.setString(3"1");  
  8. ResultSet rs = ps.executeQuery();  
  9. List list = new ArrayList();  
  10. while (rs.next()) {  
  11. list.add(new Long(rs.getLong(1)));  
  12. }  
  13. rs.close();  
  14. ps.close();  
 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值