使用HQL(hibernate query language)html
與SQL類似,SQL中的語法基本均可使用
java
SQL查詢的是表和表中的列,HQL查詢的是對象和對象中的屬性數組
HQL關鍵字不區分大小寫,可是類名和屬性是區分大小寫的緩存
SELECT能夠省略session
HQL的基本查詢語法:
函數
簡單的查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();
高級查詢:
彙集查詢:
彙集函數: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」從字面意義上理解就是根據「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型的結果,表示影響了多少行