1. 程式人生 > >Hibernate入門(六)---------HQL語句

Hibernate入門(六)---------HQL語句

Query:

    代表面向物件的一個Hibernate查詢操作.在Hibernate中,通常使用session.createQuery()方法接收一個HQL語句,然後呼叫Query的

list()或uniqueResult()方法執行查詢。所謂的HQL是Hibernate Query Language縮寫,其語法很像SQL,但它是完全面向物件的。

在Hibernate中使用Query物件的步驟,具體:

  1.獲得Hibernate的Session物件

       2.編寫HQL語句

       3.呼叫session.createQuery()建立查詢物件

    4.如果HQL語句包含引數,則呼叫Query的setXxx設定引數

       5.呼叫Query物件的list(),或uniqueResult()方法執行查詢。

 

①查詢所有記錄

@Test
    public void fun3(){
        Session session = HibernateUtils.getCurrentSession();
        Transaction tx = session.beginTransaction(); 
String hql
= "from Student"; Query query = session.createQuery(hql); List<Student> list = query.list(); System.out.println(list); }

 

②條件查詢

public void fun4(){
        Session session = HibernateUtils.getCurrentSession();
        Transaction tx = session.beginTransaction();
        
        String hql 
= "from Student Where sno = ?"; Query query = session.createQuery(hql); query.setInteger(0, 1001); Student stu = (Student) query.uniqueResult(); session.close(); System.out.println(stu.getGender()); }

③條件查詢(命名識別符號)

public void fun5(){
        Session session = HibernateUtils.getCurrentSession();
        Transaction tx = session.beginTransaction();
        
        String hql = "from Student where sname = :aaa and sage = :bbb";
        Query query = session.createQuery(hql);
        query.setString("aaa","張三");
        query.setInteger("bbb", 25);
        List<Student> list = query.list();
        
        session.close();
        System.out.println(list.get(0).getName());
    }

④分頁查詢

public void fun6(){
        Session session = HibernateUtils.getCurrentSession();
        Transaction tx = session.beginTransaction();
        
        String hql = "from Student";
        Query query = session.createQuery(hql);
        //相當於 limit 1,3
        query.setFirstResult(1);
        query.setMaxResults(3);
        List<Student> list = query.list();
        session.close();
        System.out.println(list);
    }

Query中除了list()方法查詢全部資料之外,還有一些其它常用方法,具體如下:

setter()方法:Query介面中提供了一系列的setter方法用於設定查詢語句的引數,針對不同的資料型別,需要用到不同的setter方法。

iterator()方法:該方法用於查詢語句,返回的結果是Iterator物件,在讀取時只能按照順序方式讀取,它僅把使用到的資料轉換成Java實體物件。

uniqueResult()方法:該方法用於返回唯一的結果,在確保只有一條記錄的查詢時可以使用該方法。

executeUpdate()方法:該方法是Hibernate3的新特性,它支援HQL語句的更新和刪除操作。

setFirstResult()方法:該方法可以設定獲取第一個記錄的位置,也就是它表示從第幾條記錄開始查詢,預設從0開始計算

setMaxResult()方法:該方法用於設定結果集的最大記錄數,通常與setFirstResult()方法結合使用,用於限制結果集的範圍,以實現分頁功能。

 

Criteria是一個完全面向物件,可擴充套件的條件查詢API,通過它完全不需要考慮資料庫底層如何實現,以及SQL語句如何編寫,它是Hibernate框架的核心查詢物件。

Criteria查詢,又稱QBC查詢(Query By Criteria)它是Hibernate的另一種物件檢索方式。org.hibernate.criterion.Criterion是Hibernate提供的一個面向物件查詢條件介面,一個單獨的查詢就是Criterion介面的一個例項,用於限制Criteria物件的查詢,在Hibernate中Criterion物件的建立是通過Restrictions工廠類完成的,它提供了條件查詢方法。通常:使用Criteria物件查詢資料的主要步驟:

1)獲得Hibernate的Session物件。

2)通過Session獲得Criteria物件。

3)使用Restrictions的靜態方法建立Criterion條件物件。(Restrictions類中提供了一系列用於設定查詢條件的靜態方法,這些靜態方法都返回Criterion例項,每個Criterion例項代表一個查詢條件。)

4)向Criteria物件中新增Criterion查詢條件。Criteria的add()方法用於加入查詢條件。

5)執行Criteria的list()或uniqueResult()獲得結果。

 

 ①查詢所有記錄

@Test
    public void fun7(){
        Session session = HibernateUtils.getCurrentSession();
        Transaction tx = session.beginTransaction();
        
        Criteria criteria = session.createCriteria(Student.class);
        List<Student> list = criteria.list();

        session.close();
        
        System.out.println(list);
        
    }

②條件查詢

 

@Test
    public void fun8(){
        Session session = HibernateUtils.getCurrentSession();
        Transaction tx = session.beginTransaction();
        
        Criteria criteria = session.createCriteria(Student.class);
        criteria.add(Restrictions.eq("name", "張三"));
        List<Student> list = criteria.list();
        
        session.close();
        
        System.out.println(list);       
    }

 

 

 ③分頁查詢

    @Test
    public void fun9(){
        Session session = HibernateUtils.getCurrentSession();
        Transaction tx = session.beginTransaction();
        Criteria criteria = session.createCriteria(Student.class);
        criteria.setFirstResult(1);
        criteria.setMaxResults(3);
        List<Student> list = criteria.list();
        
        session.close();
        System.out.println(list);
    }

 

SQLQuery這個介面用於接收一個sql語句進行查詢,然後呼叫list()或者uniqueResult()方法進行查詢。但是sql語句不會直接封裝到實體物件中,需要我們手動寫程式碼才可以封裝到實體中

@Test
    public void fun10(){
        Session session = HibernateUtils.getCurrentSession();
        Transaction tx = session.beginTransaction();
        SQLQuery sqlQuery = session.createSQLQuery("SELECT *FROM student");
        List<Object[]> list = sqlQuery.list();
        
        for (Object[] objects : list) {
            System.out.println(Arrays.toString(objects));
        }
        session.close();
        
    }