使用HQL查詢


  HQL是Hibernate Query Language的縮寫,語法很想SQL,但是HQL是一種面向對象的查詢語言。SQL的操作對象是數據列、表等數據庫對象,而HQL操作的是類、實例、屬性。

  HQL查詢依賴於Query類,每個Query實例對應一個查詢對象,使用HQL查詢按如下步驟進行:

  1.獲取Hibernate Session對象

  2.編寫HQL語句

  3.以HQL語句作為參數,調用Session的createQuery方法創建查詢對象

  4.如果HQL語句包含參數,則調用Query的setXxx方法為參數賦值

  5.調用Query獨享的list()或uniqueResult()方法返回查詢結果列表

簡單的例子:

@SuppressWarnings("deprecation")
public class HibernateUtil {

    private static final SessionFactory sessionFactory;
    
    static {
        sessionFactory = new AnnotationConfiguration().configure().buildSessionFactory();
    }
    
    public static Session getOpenSession() {
        return sessionFactory.openSession();
    }
    
    public static Session getCurrentSession() {
        return sessionFactory.getCurrentSession();
    }
}

 

@Entity
public class Employee {

    private Integer id;
    private String name;
    private Integer age;
    
    @Id
    @GeneratedValue
    public Integer getId() {
        return id;
    }
    
    public void setId(Integer id) {
        this.id = id;
    }
    
    @Basic
    public String getName() {
        return name;
    }
    
    public void setName(String name) {
        this.name = name;
    }
    
    @Basic
    public Integer getAge() {
        return age;
    }
    
    public void setAge(Integer age) {
        this.age = age;
    }
    
    public String toString() {
        return "id:" + id + "   " + "name:" + name +  "   " + "age:" + age;
    }
}
@SuppressWarnings("all")
public class HQLDemo {

    @Test
    public void testHQL() {
        Session session = HibernateUtil.getOpenSession();
        List<Employee> employeeList = session.createQuery("from Employee as e").list();
        for(Employee e : employeeList)
            System.out.println(e);
    }
    
    @Test
    public void testHQLHasParameter() {
        Session session = HibernateUtil.getOpenSession();
        List<Employee> employeeList = session.createQuery("from Employee as e where e.name = :personName").setString("personName", "xujianguo").list();
        for(Employee e : employeeList)
            System.out.println(e);
    }
}

 

  HQL查詢的from子句:

from是最簡單的HQL語句,也是最基本的HQL語句,from關鍵字后緊跟持久化類的類名,如:

from Employee

表名從Employee類中選出全部的實例

不過我們常用的是這樣做:

from employee as e

這個e就是Employee的別名,也就是實例名,推薦這么寫。

 

  HQL查詢的select子句:

  select子句用於選擇指定的屬性或直接選擇某個實體,當然select選擇的屬性必須是from后持久化類包含的屬性,如:

select e.name from Employee as e

  select可以選擇任意屬性,即不僅可以選擇持久化類的直接屬性,還可以選擇組件屬性包含的屬性,如:

select e.name.firstName from Employee as e

 

  HQL查詢的聚集函數:

  聚集函數:  

    avg:計算屬性的平均值

    count:統計選擇對象的數量

    max:統計屬性值的最大值

    min:統計屬性值的最小值

    sum:計算屬性值的總和

如:

select count(*) from Employee as e

 

    @Test
    public void testHQLFunction() {
        Session session = HibernateUtil.getOpenSession();
        System.out.println(session.createQuery("select count(*) from Employee as e").uniqueResult());
    }

 

  多態查詢:

  HQL不僅會查詢出該持久化類的全部實例,還會查詢出該類的子類的全部實例,前提是存在繼承映射。

 

  HQL查詢的where子句:

  where子句主要用於篩選選中的結果,縮小選擇的范圍,如:

from employee as e where e.name like "xjg%"
    @Test
    public void testHQLWhere() {
        Session session = HibernateUtil.getOpenSession();
        List<Employee> employeeList = session.createQuery("from Employee as e where e.name like 'zhou%'").list();
        for(Employee e : employeeList)
            System.out.println(e);
    }

 

  order by子句:

  查詢返回結合可以根據類或組件屬性的任何屬性進行排序,還可以使用asc或desc關鍵字指定升序或者降序,如:

from Employee as e order by e.name desc

 

  子查詢:

  子查詢中就是查詢語句中還有查詢語句,如:

from Employee as e where e.age > (select p.age from Person as p)

 

    @Test
    public void testHQLChildQuery() {
        Session session = HibernateUtil.getOpenSession();
        List<Employee> employeeList = session.createQuery("from Employee as e where e.age > (select e1.age from Employee as e1 where e1.name = 'xujianguo')").list();
        for(Employee e : employeeList)
            System.out.println(e);
    }

 

  命名查詢:

  HQL查詢還支持將查詢所用的HQL語句放入配置文件中,而不是代碼中,在Hibernate映射文件的<hibernate-mapping>元素中使用<query>子元素來定義命名查詢,這個<query>元素只需指定一個name屬性,指定該命名查詢的名字 ,如:

<query name="query">
    from Employee as e
<query />

  Session里提供了一個getNamedQuery(String name)方法,該方法用於創建一個Query對象,一旦獲得Query對象,剩下的工作就跟前面的一樣了。

    @Test
    public void testHQLNamedQuery() {
        Session session = HibernateUtil.getOpenSession();
        List<Employee> employeeList = session.getNamedQuery("query").list();
        for(Employee e : employeeList)
            System.out.println(e);
    }

 

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM