HQL

使用HQL(hibernate query language)html

  1. 與SQL類似,SQL中的語法基本均可使用
    java

  2. SQL查詢的是表和表中的列,HQL查詢的是對象和對象中的屬性數組

  3. HQL關鍵字不區分大小寫,可是類名和屬性是區分大小寫的緩存

  4. SELECT能夠省略session

HQL的基本查詢語法:
函數

  1. 簡單的查spa

hql = "FROM Employee";
hql = "FROM Employee AS e"; // 使用別名
hql = "FROM Employee e"; // 使用別名,as關鍵字可省略

2.帶上過濾條件的查詢(可使用別名):where
hibernate

hql = "FROM Employee where id<10";
hql = "FROM Employee e WHERE e.id<10";
hql = "FROM Employee e WHERE e.id<10 AND e.id>5";

3.帶上排序條件: order bycode

hql = "FROM Employee e WHERE e.id<10 ORDER BY e.name";
hql = "FROM Employee e WHERE e.id<10 ORDER BY e.name DESC";    //DESC降序
hql = "FROM Employee e WHERE e.id<10 ORDER BY e.name DESC, id ASC"

4.指定select 子句,不能使用select *htm

hql = "SELECT e FROM Employee e"; // 至關於"FROM Employee e"
hql = "SELECT e.name FROM Employee e"; // 只查詢一個列,返回的集合的元素類型就是這個屬性的類型
hql = "SELECT e.id,e.name FROM Employee e"; // 查詢多個列,返回的集合的元素類型是Object數組
hql = "SELECT new Employee(e.id,e.name) FROM Employee e"; // 可使用new語法,指定把查詢出的部分屬性封裝到對象中

5.執行查詢得到結果(list,uniqueResult,分頁)

Query query=session。createQuery("from Employee e where id<10");
query.setFirstResult(0);    //設置開始查詢處
query.setMaxResults(10);    //設置每次查詢數量
List list=query.list();    //查詢結果是以俄國list集合
Employ employ=(Employ)query.uniqueResult();    //查詢的結果是惟一的結果,將此結果取出,如有多個會拋出異常

//方法鏈的方式查詢:
List list = session.createQuery(//
    "FROM Employee")//
    .setFirstResult(0)//
    .setMaxResults(10)//
    .list();
    
//執行查詢:
List list = session.createQuery(hql).list();

 高級查詢:

  1. 彙集查詢:

彙集函數:count(*)--記錄的行數,max("")--返回一列中最大的值,min(),avg()--返回平均數,sum()

hql = "SELECT COUNT(*) FROM Employee"; // 返回的結果是Long型的
hql = "SELECT min(id) FROM Employee"; // 返回的結果是id屬性的類型
Number result = (Number) session.createQuery(hql).uniqueResult();

2.分組:group by....hanving

group by詳細分析

「Group By」從字面意義上理解就是根據「By」指定的規則對數據進行分組,所謂的分組就是將一個「數據集」劃分紅若干個「小區域」,而後針對若干個「小區域」進行數據處理(count,sum,AVG....)

where 子句的做用是在對查詢結果進行分組前,將不符合where條件的行去掉,即在分組以前過濾數據,條件中不能包含聚組函數,使用where條件顯示特定的行
having 子句的做用是篩選知足條件的組,即在分組以後過濾數據,條件中常常包含聚組函數,使用having 條件顯示特定的組,也可使用多個分組標準進行分組
SELECT A COUNT(B) FROM TABLE GROUP BY A HAVING COUNT(B)>2

hql = "SELECT e.name,COUNT(e.id) FROM Employee e GROUP BY e.name";
hql = "SELECT e.name,COUNT(e.id) FROM Employee e GROUP BY e.name HAVING count(e.id)>1";
hql = "SELECT e.name,COUNT(e.id) FROM Employee e WHERE id<9 GROUP BY e.name HAVING count(e.id)>1";

3.鏈接查詢:

將查詢結果合併爲一個表
內鏈接(inner關鍵字能夠省略)
hql = "SELECT e.id,e.name,d.name FROM Employee e JOIN e.department d";
hql = "SELECT e.id,e.name,d.name FROM Employee e INNER JOIN e.department d";
左外鏈接(outer關鍵字能夠省略,前面表所有保留)
hql = "SELECT e.id,e.name,d.name FROM Employee e LEFT OUTER JOIN e.department d";
右外鏈接(outer關鍵字能夠省略,後面表所有保存)
hql = "SELECT e.id,e.name,d.name FROM Employee e RIGHT JOIN e.department d";
可使用更方便的方法
hql = "SELECT e.id,e.name,e.department.name FROM Employee e";

4.查詢時使用參數

方法一:使用?站位

hql="from Employee where id between ? nad ?"
List list=session.createQuery(hql)//
    .setParameter(0,5)//設置參數,第一個參數索引爲0,設置其值爲5
    .setParmeter(1,15)//設置參數,第一個參數索引爲1,設置其值爲15
    .list();

方法二:使用變量名

hql = "FROM Employee e WHERE id BETWEEN :idMin AND :idMax";
List list = session.createQuery(hql)    //
	.setParameter("idMax", 15)    //
	.setParameter("idMin", 5)    //
	.list();
	
當參數是集合的時候,必定要使用setParameterList()設置參數值
hql = "FROM Employee e WHERE id IN (:ids)";
List list = session.createQuery(hql)//
	.setParameterList("ids", new Object[] { 1, 2, 3, 5, 8, 100 })//
	.list();

5.update與delete,不會通知Session緩存

// >> Update
 int result = session.createQuery(//
"UPDATE Employee e SET e.name=? WHERE id>15")//
	.setParameter(0, "無名氏")//
	.executeUpdate(); // 返回int型的結果,表示影響了多少行
相關文章
相關標籤/搜索