Hibernate的查询方式

Hibernate的查询的方式

    OID检索

      get或load方法进行的查询

    对象导航检索

      linkman.getCustomer();

    HQL检索

       用于接收hql语句进行查询,面向对象查询方式。

        通过session.createQuery(String hql);

          简单查询

 1 @Test
 2     public void fun1() {
 3         //获取session
 4         Session session = HibernateUtils.openSession();
 5         //打开事务
 6         Transaction tx=session.beginTransaction();
 7         //--------------------------------------
 8         //完整写法
 9         String hql1="from cn.itheima.domain.Customer";
10         //简单写法
11         String hql2="from Custom";
12         //扩展写法
13         //如果用这种写法对象是Object,接收对象List不用泛型
14         String hql3="from java.lang.object";
15         Query query = session.createQuery(hql1);
16         
17         List<Customer> list=query.list();
18         
19         System.out.println(list);
20         //--------------------------------------
21         //提交事务
22         tx.commit();
23         //关闭session
24         session.close();    
25         
26     }
View Code

          别名查询

         排序查询

 1 @Test
 2     //排序
 3     public void fun2() {
 4         //获取session
 5         Session session = HibernateUtils.openSession();
 6         //打开事务
 7         Transaction tx=session.beginTransaction();
 8         //--------------------------------------
 9         //完整写法
10         String hql1="from cn.itheima.domain.Customer order by cust_id asc";
11         String hql2="from cn.itheima.domain.Customer order by cust_id desc";
12         Query query = session.createQuery(hql1);
13         
14         List<Customer> list=query.list();
15         //query.setParameter("id", 2l);
16         
17         System.out.println(list);
18         //--------------------------------------
19         //提交事务
20         tx.commit();
21         //关闭session
22         session.close();
23         
24     }
View Code

         条件查询

         分组统计查询

         投影查询

 1 @Test
 2     //投影查询
 3     public void fun5() {
 4         //获取session
 5         Session session = HibernateUtils.openSession();
 6         //打开事务
 7         Transaction tx=session.beginTransaction();
 8         //--------------------------------------
 9         //完整写法
10         String hql1="select cust_name from cn.itheima.domain.Customer ";
11         String hql2="select cust_name,cust_id from cn.itheima.domain.Customer ";
12         String hql3="select new Customer(cust_name,cust_id) from cn.itheima.domain.Customer ";
13         
14         Query query = session.createQuery(hql2); 
15         
16         List<Object[]> list = query.list();
17         System.out.println(list);
18         //--------------------------------------
19         //提交事务
20         tx.commit();
21         //关闭session
22         session.close();
23     }
View Code

            分页查询

 1 @Test
 2     //分页
 3     public void fun3() {
 4         //获取session
 5         Session session = HibernateUtils.openSession();
 6         //打开事务
 7         Transaction tx=session.beginTransaction();
 8         //--------------------------------------
 9         //完整写法
10         String hql1="from cn.itheima.domain.Customer order by cust_id asc";
11         String hql2="from cn.itheima.domain.Customer order by cust_id desc";
12         Query query = session.createQuery(hql1);
13         
14         //(当前页数-1)*每页条数
15         query.setFirstResult(0);
16         query.setMaxResults(2);
17         //query.setParameter("id", 2l);
18         
19         
20         List<Customer> list=query.list();
21         
22         System.out.println(list);
23         //--------------------------------------
24         //提交事务
25         tx.commit();
26         //关闭session
27         session.close();
28     }
View Code

         多表查询

    QBC检索

      用于进行条件查询(Query By Criteria),更加面向对象的方式。

      通过session.createCriteria(Class clazz);

 1 @Test
 2     //基本语法
 3     //注意此时生成ToString方法
 4     public void fun1() {
 5         //获取session
 6         Session session = HibernateUtils.openSession();
 7         //打开事务
 8         Transaction tx=session.beginTransaction();
 9         //--------------------------------------
10         //完整写法
11         Criteria c = session.createCriteria(Customer.class);
12         
13         List<Customer> list =c.list();
14         System.out.println(list);
15         
16         
17         //--------------------------------------
18         //提交事务
19         tx.commit();
20         //关闭session
21         session.close();
22         
23     }
View Code

        简单查询

        排序查询

 1 @Test
 2     //排序语法
 3     public void fun4() {
 4         //获取session
 5         Session session = HibernateUtils.openSession();
 6         //打开事务
 7         Transaction tx=session.beginTransaction();
 8         //--------------------------------------
 9         //完整写法
10         
11         Criteria c = session.createCriteria(Customer.class);
12         
13         //c.addOrder(Order.asc("cust_id"));//升序
14         c.addOrder(Order.desc("cust_id"));//降序
15         
16         
17         List<Customer> list=c.list();
18         System.out.println(list);
19         
20         //--------------------------------------
21         //提交事务
22         tx.commit();
23         //关闭session
24         session.close();
25     }
View Code

        分组统计查询

        分页查询

 1 @Test
 2     //分页语法-与HQL一样
 3     public void fun3() {
 4         //获取session
 5         Session session = HibernateUtils.openSession();
 6         //打开事务
 7         Transaction tx=session.beginTransaction();
 8         //--------------------------------------
 9         Criteria c=session.createCriteria(Customer.class);
10         //limit  ?,?
11         c.setFirstResult(0);
12         c.setMaxResults(2);
13         
14         List<Customer> list =c.list();
15         System.out.println(list);
16         
17         
18         
19         //--------------------------------------
20         //提交事务
21         tx.commit();
22         //关闭session
23         session.close();
24     }
View Code

        条件查询

        离线条件查询

 1 @Test
 2     //基本语法
 3     //注意此时生成ToString方法
 4     public void fun1() {
 5         //service/web层
 6         DetachedCriteria dc=DetachedCriteria.forClass(Customer.class);
 7         
 8         dc.add(Restrictions.idEq(61));//瓶装条件(全部与普通Criteria一致)
 9         //获取session
10         Session session = HibernateUtils.openSession();
11         //打开事务
12         Transaction tx=session.beginTransaction();
13         //--------------------------------------
14         Criteria c=dc.getExecutableCriteria(session);
15         List list=c.list();
16         System.out.println(list);
17         
18         
19         
20         //--------------------------------------
21         //提交事务
22         tx.commit();
23         //关闭session
24         session.close();
25 
26         
27     }
View Code

     SQL检索

      用于接收sql进行查询。

      通过session.createSQLQuery(String sql);

Hibernate的抓取策略(优化)

    延迟加载

      类级别             在<class>上配置lazy属性

      关联级别        在<set>、<many-to-one>上配置的lazy属性

    

    抓取策略

      Set上的fetch和lazy

        fetch   :     

          select

           join

          subselect

        lazy           :

          true

          false

          extra

      many-to-one上fetch和lazy

        fetch

        select

        join

       lazy

        proxy

        false

        no-proxy

  结论:为了提高效率.fetch的选择上应选择select. lazy的取值应选择 true. 全部使用默认值.

原文地址:https://www.cnblogs.com/money131/p/10691708.html