Hibernate 查詢:HQL查詢(Hibernate Query Languge)

HQL是一種面向對象的查詢語言,其中沒有表和字段的概念,只有類,對象和屬性的概念。sql

 

使用HQL查詢全部學生:

public static void main(String[] args) {
        Session session = HibernateUtil.getSessionFactory().getCurrentSession();
        session.beginTransaction();
        
        String hql = "from Student";
        Query query = session.createQuery(hql);
        List<Student> students = query.list();
        System.out.println(students);
        
        session.getTransaction().commit();
    }

字符串 hql 是一條HQl語句,其中Student是指類名而不是表名,該語句查詢Student類所映射的表的全部信息。
使用HQL查詢時須要使用到org.hibernate.Query接口,使用Session.createQuery()方法來獲得一個Query。
使用Query.list方法向數據庫查詢數據,hibernate會自動把數據封裝爲相應的List集合。你也能夠使用query.iterate()來獲得一個Iterate。數據庫

 

查詢單個對象(使用 uniqueResult()):

public static void main(String[] args) {
        Session session = HibernateUtil.getSessionFactory().getCurrentSession();
        session.beginTransaction();
        
        String hql = "from Student where id = 1";
        Query query = session.createQuery(hql);
        Student student = (Student)query.uniqueResult();
        System.out.println(student);
        
        session.getTransaction().commit();
    }

HQL 語句裏能夠有where字句,其中where id = 1 查找 id屬性爲1的學生,注意的是id是Student對象的屬性,而不是表的列名!
確得查詢結果只有一條記錄事,能夠使用Query.uniqueResult()方法。hibernate會自動把數據封閉爲相應的對象。session

 

查詢指定的列:

public static void main(String[] args) {
        Session session = HibernateUtil.getSessionFactory().getCurrentSession();
        session.beginTransaction();
        
        String hql = "select id,name from Student";
        Query query = session.createQuery(hql);
        List<Object[]> s = query.list();
        
        session.getTransaction().commit();
    }

HQL能夠只查詢表的其中一列或多列。使用select字句,其中id和name是Student對象的屬性名,而不是表的列名!
只查詢指定列返回的是一個List<Object[]>對象。List裏的一條記錄對應數據庫表的一行。Object[]的一個元素即對應表的一個單元格。
若是使用 uniqueResult() 那返回的就是Object[]對象。app

 

帶命名參數的HQL:

public static void main(String[] args) {
        Session session = HibernateUtil.getSessionFactory().getCurrentSession();
        session.beginTransaction();
        
        String hql = " from Student where name like :name";
        Query query = session.createQuery(hql);
        query.setString("name", "張%");
        List<Student> s = query.list();
        
        session.getTransaction().commit();
    }

在HQL中,使用 : 加命名(如 :name)做爲佔位符,再使用Query.setString(),query.setInteger()等方法爲相應的佔位符設置參數(不肯定類型能夠使用setParameter())。
上面例子中的HQL語句等同於 "from Student where name like '張%'"函數

 

實例參數查詢:

經過添加一個新類來做爲HQL語句查詢條件的參數。spa

public class BookQuery {

    private String name;
    private String author;
    private double maxPrice;
    private double minPrice;
    
    //省略get,set語句.........

}

查詢任意名字,做者姓張,價格在5-20之間的圖書:hibernate

public static void main(String[] args) {
        //建立查詢條件對象
        BookQuery bq= new BookQuery();
        bq.setName("%");
        bq.setAuthor("張%");
        bq.setMinPrice(5);
        bq.setMaxPrice(20);
        
        Session session = HibernateUtil.getSessionFactory().getCurrentSession();
        session.beginTransaction();
        
        String hql = "from Book where name like :name "
                + "and author like :author "
                + "and price between :minPrice and :maxPrice";
        Query query = session.createQuery(hql);
        //把查詢條件對象做爲HQL查詢的參數
        query.setProperties(bq);
        List<Book> books = query.list();
        
        session.getTransaction().commit();
    }

BookQuery類的屬性名必須和HQL語句的參數名一致,並提供get,set方法。
經過 setProperties()方法把查詢條件對象做爲HQL查詢的參數。code

 

鏈接查詢(join 語法):

public static void main(String[] args) {
        Session session = HibernateUtil.getSessionFactory().getCurrentSession();
        session.beginTransaction();
        
        String hql = "from Student s inner join s.grade g";
        Query query = session.createQuery(hql);
        List<Object[]> s = query.list();
        
        session.getTransaction().commit();
    }

內鏈接使用join,左外鏈接使用left join,右外鏈接使用reght join。和sql語句基本一致。
join 後面是 s.grade 而不是直接寫 Grade 類名。
由於表之間的關聯關係已經經過映射文件或註解設好,因此在join子句中不須要聲明關係。
上面例子裏同時返回學生和班級的全部信息,返回值是一個 List<Object[]><Object[]> 。其中每個Object[]裏,下標0的元素爲Student對象,下標1的元素爲Grade對象。xml

 

使用聚合函數:

public static void main(String[] args) {
        Session session = HibernateUtil.getSessionFactory().getCurrentSession();
        session.beginTransaction();
        
        String hql = "Select count(s) from Student s";
        Query query = session.createQuery(hql);
        Object count = query.uniqueResult();
        
        session.getTransaction().commit();
    }

count()求總數、avg(...), sum(...), min(...), max(...)分別是平均值,總和,最大,最小值。對象

 

Hibernate 分頁:

public static void main(String[] args) {
        Session session = HibernateUtil.getSessionFactory().getCurrentSession();
        session.beginTransaction();
        
        String hql = "from Student ";
        Query query = session.createQuery(hql);
        query.setFirstResult(2);
        query.setMaxResults(2);
        List<Student> s = query.list();
        System.out.println(s);
        session.getTransaction().commit();
    }

 

setFirstResult:設置開始行,從0開始。
setMaxResults:設置取的記錄數。

 

HQL命名查詢:

經過把hql語句寫到外部映射文件(*.hbm.xml)來實現HQL和代碼分離。

在學生表的映射文件中加入以下代碼:

<query name="getStudent">
    <![CDATA[from Student where id=:id]]>
</query>

<query>標籤寫在<hibernate-mapping>標籤內。
<![CDATA[   ]]>  寫的是一條HQL語句。
經過<query>標籤的name屬性爲該HQL指定一個名稱。

public static void main(String[] args) {
        Session session = HibernateUtil.getSessionFactory().getCurrentSession();
        session.beginTransaction();
        
        Query query = session.getNamedQuery("getStudent");
        query.setInteger("id", 6);
        Student s = (Student)query.uniqueResult();
        
        session.getTransaction().commit();
    }

經過session.getNamedQuery()方法獲得一個用於命名查詢的Query。把HQL語句的名稱傳進去。

相關文章
相關標籤/搜索