標籤:指定 業務 white 返回 最大的 str 3.0 投影 like
HQL 是指Hibernate Query Language,它是Hibernate的查詢語言,擁有一套自己的查詢機制,它的查詢語句和SQL非常類似。在使用的時候可以非常快上手。HQL提供了基本上SQL全部的查詢功能,可是在使用HQL查詢時有非常多地方須要注意。該篇文章整理了HQL查詢過程中須要注意的一些主要的文法問題,在使用HQL查詢時希望避免這些問題。
一、Hibernate簡單介紹
HQL採用的是標準化物件查詢。它是以對象的方式進行查詢。將查詢語句封裝為對象操作。長處:可讀性好。複合java程式猿的編碼習慣。缺點:不夠成熟,不支援投影或統計函數。
範例:查詢username以“J”開頭的全部使用者
Criteria criteria=session.createCriteria(User.class);criteria.add(Expression.like("name","J%"));List users=criteria.list();
HQL它是全然物件導向的查詢語句,查詢功能很強大。具備多態、關聯等特性。它是利用物件導向的方式產生SQL。以類和屬性來取代表和資料列。它同一時候支援多態。支援各種關聯,降低了SQL的冗餘。
HQL支援全部的關聯式資料庫操作:串連(join。包含Inner/outer/full joins),笛卡爾積(cartesian products),投影(projection),彙總(Aggregation,max,avg)和分組(group), 排序(Ordering),子查詢(Subqueries),SQL函數(SQL function calls)。
二、 查詢方法
2.1 createQuery
createQuery方法被封裝在Session中,它可以依照查詢語句查詢擷取資料庫中整張表的資料。它會建立一個新的Query介面。該方法須要使用HQL查詢字串作為該方法的參數,並將最後查詢到的對象儲存在List對象中。詳細用法例如以下代碼:
package com.hibernate;import java.util.Iterator;import java.util.List;import junit.framework.TestCase;import org.hibernate.Query;import org.hibernate.Session;public class testTable extends TestCase {public void testCreateQuery(){Session session=null;try{//擷取session對象session=HibernateUtils.getSession();//開啟事務session.beginTransaction();//查詢擷取整張表Query query=session.createQuery(" from User");//擷取表單對象List list=query.list();//定義迭代器,迭代擷取每一個對象for(Iterator ite=list.iterator();ite.hasNext();){User user=(User)ite.next();System.out.println("id號為"+user.getId()+" 姓名為:"+user.getName()+" ");}//業務提交session.getTransaction().commit();}catch(Exception e){e.printStackTrace();session.getTransaction().rollback();}finally{session.close();}} }
查看輸出結果:
資料庫中總共同擁有三條資料。所以在控制台中總共輸出了三條資料。讓我們回頭查看查詢語句。createQuery方法中使用了HQL查詢字串。其內容為"from User",該方法建立了一個Query對象,它把查詢得到的資訊存放到List對象中,想要的對象從List中擷取就可以。
Note:查詢字串中的User是對象的類名,並非資料庫中表的名稱。
在使用HQL查詢內容時,肯定會用到該方法,它返回一個Query介面,查詢到的對象能夠轉化為List類型或者Iterate類型的集合,可通過迭代器擷取查詢對象,擷取的兩種類型的集合還是不同樣的。List類型的預設情況下每次都會發出sql語句,而且將資料放到緩衝中,可是不利用緩衝。Iterate,預設情況下是從緩衝中查詢資料,假設緩衝中不存在對象則會產生N+1問題(每次使用查詢語句將對象載入到記憶體中。然後再讀取)。具體差別將會在接下來的文章中討論。
2.2 簡單屬性查詢
在使用HQL查詢語句時能夠指定查詢表的屬性。它的用法同主要的SQL語句,在查詢語句中加入表欄位來擷取對應的查詢欄位集合。不同的是HQL中的欄位是對象的屬性名稱。須要指定屬性名稱方能查詢擷取對應的欄位集合。
2.2.1 查詢對象Student
建立一個Student類,並將類映射為對應的資料庫表,查詢資料庫表中的資料。Student類檔案內部代碼例如以下:
package com.src.hibernate;import java.util.Date;public class Student {public Student() {}//關聯的班級對象private Classes classes;public Classes getClasses() {return classes;}public void setClasses(Classes classes) {this.classes = classes;}//學生idprivate int id;public int getId() {return id;}public void setId(int id) {this.id = id;}//學生姓名private String name;public String getName() {return name;}public void setName(String name) {this.name = name;}//建立時間private Date createTime;public Date getCreateTime() {return createTime;}public void setCreateTime(Date createTime) {this.createTime = createTime;}}
對應的對應檔代碼例如以下:
<?xml version="1.0"?><!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN""http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"><hibernate-mapping><class name="com.src.hibernate.Student" table="t_student"><id name="id"><generator class="native"/></id><property name="name"/><property name="createTime"></property><!-- 在多的一端Student中加入一行新的Classes列 ,而且列的名稱要和Classes.hbm.xml的列明同樣--><many-to-one name="classes" column="classesid"></many-to-one></class></hibernate-mapping>
2.2.2 屬性查詢
屬性查詢是指在select語句中的欄位列是對應對象的屬性名稱,這樣在查詢時可依據提供的屬性列來查詢擷取想要的欄位集合,另外在簡單屬性查詢中能夠分為單一屬性查詢和多個屬性查詢。單一屬性是指在select欄位中加入對象的單個欄位。相反的多屬性查詢是加入多個欄位列。假設想要查詢擷取對象的全部列,能夠在select後加入對象的別名,這樣能夠查詢到對象的全部列,例如以下的查詢代碼:
//多個屬性查詢,返回Object@SuppressWarnings({ "unchecked", "rawtypes" })public void testQuery2(){Session session=null;try{session=HibernateUtils.getSession();session.beginTransaction();//查詢多個屬性,返回對象數組集合。通過使用對象的別名來查詢對象的全部列屬性,別名的使用同SQL//假設使用select查詢實體物件。必須使用別名//HQL不支援*查詢,可是支援Count(*)查詢List students=session.createQuery("select s from Student s").list();for(Iterator iter=students.iterator();iter.hasNext();){Student student=(Student)iter.next();System.out.println(student.getName());}session.getTransaction().commit();}catch(Exception e){e.printStackTrace();session.getTransaction().rollback();}finally{HibernateUtils.closeSession(session);}}
HQL的查詢不支援*查詢。可是能夠通過使用類的別名來替代*查詢,同一時候HQL可支援Count(*)查詢,查詢簡單易懂。
2.3 分頁查詢
擷取的Query對象能夠使用分頁查詢,通過設定對象的setFirstResult和setMaxResults來擷取指定的行資料,詳細代碼例如以下:
try{//擷取session對象session=HibernateUtils.getSession();//開啟事務session.beginTransaction();//查詢擷取整張表Query query=session.createQuery(" from User");//分頁查詢//設定查詢事實上地址query.setFirstResult(2);//設定查詢最大的條數query.setMaxResults(2);//擷取表單對象List list=query.list();//定義迭代器,迭代擷取每一個對象for(Iterator ite=list.iterator();ite.hasNext();){User user=(User)ite.next();System.out.println("id號為"+user.getId()+" 姓名為:"+user.getName()+" ");}//業務提交session.getTransaction().commit();}catch(Exception e){e.printStackTrace();session.getTransaction().rollback();}finally{session.close();}
運行上面的查詢語句,擷取查詢結果例如以:
結語
HQL查詢在功能上可以和SQL查詢媲美,但和SQL不同的是HQL是全然物件導向的查詢語言,具備多態關聯等的特性。它是利用面向的對象的方式產生SQL,以類及屬性取代表和表列,在使用時簡單易懂。該篇文章具體討論了HQL的基本查詢內容。有關很多其它HQL的問題將會在下篇文章中著重討論。
【Hibernate步步為營】--hql查詢小介