391、Java框架46 -【Hibernate - 查詢HQL、查詢Criteria、查詢標準SQL】 2020.10.19

youyouwuxin1234發表於2020-10-19

1、HQL

HQL(Hibernate Query Language)是hibernate專門用於查詢資料的語句,有別於SQL,HQL 更接近於物件導向的思維方式。

比如使用的是類的名字Product,而非表格的名字product_

2、使用HQL,根據name進行模糊查詢

  1. 首先根據hql建立一個Query物件
  2. 設定引數(和基1的PreparedStatement不一樣,Query是基0的)
  3. 通過Query物件的list()方法即返回查詢的結果了。

注: 使用hql的時候,用的是類名Product,而不是表名product_
注: 使用hql的時候,不需要在前面加 select *

package com.how2java.test;
 
import java.util.List;
 
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
 
import com.how2java.pojo.Product;
 
public class TestHibernate {
    public static void main(String[] args) {
        SessionFactory sf = new Configuration().configure().buildSessionFactory();
 
        Session s = sf.openSession();
        s.beginTransaction();
 
        String name = "iphone";
        Query q =s.createQuery("from Product p where p.name like ?");
        q.setString(0, "%"+name+"%");
        List<Product> ps= q.list();
        for (Product p : ps) {
            System.out.println(p.getName());
        }
         
        s.getTransaction().commit();
        s.close();
        sf.close();
    }
 
}

3、查詢Criteria

使用Criteria進行資料查詢。
與HQL和SQL的區別是Criteria 完全是 物件導向的方式在進行資料查詢,將不再看到有sql語句的痕跡

4、使用Criteria,根據name進行模糊查詢

使用Criteria 查詢資料

  1. 通過session的createCriteria建立一個Criteria 物件
  2. Criteria.add 增加約束。 在本例中增加一個對name的模糊查詢(like)
  3. 呼叫list()方法返回查詢結果的集合

除此之外,Criteria 還可以很方便的進行進行分頁查詢和獲取總數

package com.how2java.test;
  
import java.util.List;
 
import org.hibernate.Criteria;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
import org.hibernate.criterion.Restrictions;
 
import com.how2java.pojo.Product;
  
public class TestHibernate {
    public static void main(String[] args) {
        SessionFactory sf = new Configuration().configure().buildSessionFactory();
  
        Session s = sf.openSession();
        s.beginTransaction();
 
        String name = "iphone";
          
        Criteria c= s.createCriteria(Product.class);
        c.add(Restrictions.like("name", "%"+name+"%"));
        List<Product> ps = c.list();
        for (Product p : ps) {
            System.out.println(p.getName());
        }
        s.getTransaction().commit();
        s.close();
        sf.close();
    }
}

5、查詢-標準SQL

通過標準SQL語句進行查詢
Hibernate依然保留了對標準SQL語句的支援,在一些場合,比如多表聯合查詢,並且有分組統計函式的情況下,標準SQL語句依然是效率較高的一種選擇

6、使用標準SQL,根據name進行模糊查詢

使用Session的createSQLQuery方法執行標準SQL語句

因為標準SQL語句有可能返回各種各樣的結果,比如多表查詢,分組統計結果等等。 不能保證其查詢結果能夠裝進一個Product物件中,所以返回的集合裡的每一個元素是一個物件陣列。 然後再通過下標把這個物件陣列中的資料取出來。

package com.how2java.test;
 
import java.util.List;
 
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
 
public class TestHibernate {
    public static void main(String[] args) {
        SessionFactory sf = new Configuration().configure().buildSessionFactory();
 
        Session s = sf.openSession();
        s.beginTransaction();
 
        String name = "iphone";
         
        String sql = "select * from product_ p where p.name like '%"+name+"%'";
         
        Query q= s.createSQLQuery(sql);
        List<Object[]> list= q.list();
        for (Object[] os : list) {
            for (Object filed: os) {
                System.out.print(filed+"\t");
            }
            System.out.println();
        }
         
        s.getTransaction().commit();
        s.close();
        sf.close();
    }
}

7、參考連結

[01] How2j - Hibernate - 查詢HQL

[02] How2j - 查詢Criteria

[03] How2j - 查詢標準SQL

相關文章