hibernate hql查询 与Criteria 查询语句区别和效率

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了hibernate hql查询 与Criteria 查询语句区别和效率相关的知识,希望对你有一定的参考价值。

criteria是面向对象的查询,hql一个是伪面向对象。效率的话,都差不多,都是通过反射来。相比下hql更慢,因为还得解析hql字符串 参考技术A 这个没有比较过,只不过是HIbernate为我们提供的两种访问数据库的方式而已,HQL查询就是对于SQL语句比较熟悉的人 转换到 HQL语句查询比较方便,如果SQL语句不是很熟悉的人 可以使用 Criteria查询,可以完全不使用SQL语句进行查询。

Hibernate HQL,Criteria和SQL

Hibernate HQL和Criteria

  HQL:HQL(Hibernate Query Language)是hibernate专门用于查询数据的语句,有别于SQL,HQL 更接近于面向对象的思维方式。

 1 /**
 2  * ---------HQL查询根据name进行模糊查询--------
 3  
 4  */
 5 public class TestHibernate6 {
 6     public static void main(String[] args) {
 7         SessionFactory sessionFactory = new Configuration().configure().buildSessionFactory();
 8         Session session = sessionFactory.openSession();
 9         session.beginTransaction();
10         //模糊查询
11         String name="iPhone";
12         //HQL查询SQL语句
13         Query query = session.createQuery("from Product p where p.name like ?");
14         query.setString(0,"%"+name+"%");
15         List<Product> productList = query.list();
16         for (Product product : productList) {
17             System.out.println(product);
18         }
19         //提交时事务
20         session.getTransaction().commit();
21         //关闭
22         session.close();
23         sessionFactory.close();
24     }
25 
26 }

  Criteria:与HQL和SQL的区别是Criteria 完全是 面向对象的方式在进行数据查询,将不再看到有sql语句的痕迹

 1 /**
 2  * ---------Criteria查询根据name进行模糊查询--------
 3  * @author fereli
 4  */
 5 public class TestHibernate7 {
 6     public static void main(String[] args) {
 7         SessionFactory sessionFactory = new Configuration().configure().buildSessionFactory();
 8         Session session = sessionFactory.openSession();
 9         session.beginTransaction();
10         //模糊查询
11         String name="iPhone";
12         //Criteria的使用
13         Criteria criteria = session.createCriteria(Product.class);
14         criteria.add(Restrictions.like("name","%"+name+"%"));
15         List<Product> productList = criteria.list();
16         for (Product product : productList) {
17             System.out.println(product);
18         }
19         //提交时事务
20         session.getTransaction().commit();
21         //关闭
22         session.close();
23         sessionFactory.close();
24     }
25 
26 }

  两个结果一样:

技术图片

  SQL:因为标准SQL语句有可能返回各种各样的结果,比如多表查询,分组统计结果等等。 不能保证其查询结果能够装进一个Product对象中,所以返回的集合里的每一个元素是一个对象数组。 然后再通过下标把这个对象数组中的数据取出来。

 1 /**
 2  * ---------标注sql查询根据name进行模糊查询--------
 3  * @author fereli
 4  */
 5 public class TestHibernate8 {
 6     public static void main(String[] args) {
 7         SessionFactory sessionFactory = new Configuration().configure().buildSessionFactory();
 8         Session session = sessionFactory.openSession();
 9         session.beginTransaction();
10         //模糊查询
11         String name="iPhone";
12         //标准sql的使用
13         String sql="select * from product_ p where p.name like ‘%"+name+"%‘";
14         Query query= session.createSQLQuery(sql);
15         List<Object[]> list = query.list();
16         for (Object[] objects : list) {
17             for (Object object : objects) {
18                 System.out.print(object+"	");
19             }
20             System.out.println();
21         }
22         //提交时事务
23         session.getTransaction().commit();
24         //关闭
25         session.close();
26         sessionFactory.close();
27     }
28 }

  结果:

技术图片

以上是关于hibernate hql查询 与Criteria 查询语句区别和效率的主要内容,如果未能解决你的问题,请参考以下文章

Hibernate使用HQL,Criteria和Native SQL查询,哪个好?

Hibernate HQL,Criteria和SQL

hibernate框架学习笔记7:HQL查询Criteria查询

grails的criteria和hql查询

Hibernate学习之hql 与sql

Hibernate-hql查询