經常使用的Hql語句

數據庫javajava


[java] view plaincopyprint?在CODE上查看代碼片派生到個人代碼片數據庫

  1. // HQL: Hibernate Query Language.  數組

  2. // 特色:  緩存

  3. // >> 1,與SQL類似,SQL中的語法基本上均可以直接使用。  session

  4. // >> 2,SQL查詢的是表和表中的列;HQL查詢的是對象與對象中的屬性。  函數

  5. // >> 3,HQL的關鍵字不區分大小寫,類名與屬性名是區分大小寫的。  spa

  6. // >> 4,SELECT能夠省略.         .net

  7.           

  8. // 1,簡單的查詢,Employee爲實體名而不是數據庫中的表名(面向對象特性)  code

  9. hql = "FROM Employee";  對象

  10. hql = "FROM Employee AS e"// 使用別名  

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

  12.   

  13. // 2,帶上過濾條件的(能夠使用別名):Where  

  14. hql = "FROM Employee WHERE id<10";  

  15. hql = "FROM Employee e WHERE e.id<10";  

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

  17.   

  18. // 3,帶上排序條件的:Order By  

  19. hql = "FROM Employee e WHERE e.id<10 ORDER BY e.name";  

  20. hql = "FROM Employee e WHERE e.id<10 ORDER BY e.name DESC";  

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

  22.   

  23. // 4,指定select子句(不能夠使用select *)  

  24. hql = "SELECT e FROM Employee e"// 至關於"FROM Employee e"  

  25. hql = "SELECT e.name FROM Employee e"// 只查詢一個列,返回的集合的元素類型就是這個屬性的類型  

  26. hql = "SELECT e.id,e.name FROM Employee e"// 查詢多個列,返回的集合的元素類型是Object數組  

  27. hql = "SELECT new Employee(e.id,e.name) FROM Employee e"// 能夠使用new語法,指定把查詢出的部分屬性封裝到對象中  

  28.   

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

  30. Query query = session.createQuery("FROM Employee e WHERE id<3");  

  31. query.setFirstResult(0);  

  32. query.setMaxResults(10); // 等同於 limit 0,10  

  33. //兩種查詢結果list、uniqueResult  

  34. // List list = query.list(); // 查詢的結果是一個List集合  

  35. // Employee employee = (Employee) query.uniqueResult();// 查詢的結果是惟一的一個結果,當結果有多個,就會拋異常  

  36.   

  37. // 6,方法鏈  

  38. List list = session.createQuery(//  

  39.         "FROM Employee e")//  

  40.         .setFirstResult(0)//  

  41.         .setMaxResults(10)//  

  42.         .list();  

  43.   

  44. // 7,彙集函數:count(), max(), min(), avg(), sum()  

  45. hql = "SELECT COUNT(*) FROM Employee"// 返回的結果是Long型的  

  46. hql = "SELECT min(id) FROM Employee"// 返回的結果是id屬性的類型  

  47.   

  48. //8,分組: Group By ... Having  

  49. hql = "SELECT e.name,COUNT(e.id) FROM Employee e GROUP BY e.name";  

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

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

  52. hql = "SELECT e.name,COUNT(e.id) " + //  

  53.      "FROM Employee e " + //  

  54.      "WHERE id<9 " + //  

  55.      "GROUP BY e.name " + //  

  56.      "HAVING count(e.id)>1 " + //  

  57.      "ORDER BY count(e.id) ASC";  

  58. hql = "SELECT e.name,COUNT(e.id) AS c " + //  

  59.      "FROM Employee e " + //  

  60.      "WHERE id<9 " + //  

  61.      "GROUP BY e.name " + //  

  62.      "HAVING count(e.id)>1 " + // 在having子句中不能使用列別名  

  63.      "ORDER BY c ASC"// 在orderby子句中能夠使用列別名  

  64.   

  65. // 9,鏈接查詢 / HQL是面向對象的查詢  

  66.  //>> 內鏈接(inner關鍵字能夠省略)  

  67.  hql = "SELECT e.id,e.name,d.name FROM Employee e JOIN e.department d";  

  68.  hql = "SELECT e.id,e.name,d.name FROM Employee e INNER JOIN e.department d";  

  69.  //>> 左外鏈接(outer關鍵字能夠省略)  

  70.  hql = "SELECT e.id,e.name,d.name FROM Employee e LEFT OUTER JOIN e.department d";  

  71.  //>> 右外鏈接(outer關鍵字能夠省略)  

  72.  hql = "SELECT e.id,e.name,d.name FROM Employee e RIGHT JOIN e.department d";  

  73.  //能夠使用更方便的方法  

  74.  hql = "SELECT e.id,e.name,e.department.name FROM Employee e";  

  75.   

  76. // 10,查詢時使用參數  

  77. // >> 方式一:使用'?'佔位  

  78.  hql = "FROM Employee e WHERE id BETWEEN ? AND ?";  

  79.  List list2 = session.createQuery(hql)//  

  80.      .setParameter(05)// 設置參數,第1個參數的索引爲0。  

  81.      .setParameter(115)//  

  82.      .list();  

  83.   

  84. // >> 方式二:使用變量名  

  85.  hql = "FROM Employee e WHERE id BETWEEN :idMin AND :idMax";  

  86.  List list3 = session.createQuery(hql)//  

  87.      .setParameter("idMax"15)//  

  88.      .setParameter("idMin"5)//  

  89.      .list();  

  90.   

  91. // 當參數是集合時,必定要使用setParameterList()設置參數值  

  92.  hql = "FROM Employee e WHERE id IN (:ids)";  

  93.  List list4 = session.createQuery(hql)//  

  94.      .setParameterList("ids"new Object[] { 12358100 })//  

  95.      .list();  

  96.   

  97. // 11,update與delete,不會通知Session緩存  

  98. // >> Update  

  99. int result = session.createQuery(//  

  100.         "UPDATE Employee e SET e.name=? WHERE id>15")//  

  101.         .setParameter(0"無名氏")//  

  102.         .executeUpdate(); // 返回int型的結果,表示影響了多少行。  

  103. // >> Delete  

  104. int result1 = session.createQuery(//  

  105.         "DELETE FROM Employee e WHERE id>15")//  

  106.         .executeUpdate(); // 返回int型的結果,表示影響了多少行。  

// HQL: Hibernate Query Language.
// 特色:
// >> 1,與SQL類似,SQL中的語法基本上均可以直接使用。
// >> 2,SQL查詢的是表和表中的列;HQL查詢的是對象與對象中的屬性。
// >> 3,HQL的關鍵字不區分大小寫,類名與屬性名是區分大小寫的。
// >> 4,SELECT能夠省略.		
		
// 1,簡單的查詢,Employee爲實體名而不是數據庫中的表名(面向對象特性)
hql = "FROM Employee";
hql = "FROM Employee AS e"; // 使用別名
hql = "FROM Employee e"; // 使用別名,as關鍵字可省略

// 2,帶上過濾條件的(能夠使用別名):Where
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 By
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";
hql = "FROM Employee e WHERE e.id<10 ORDER BY e.name DESC, id ASC";

// 4,指定select子句(不能夠使用select *)
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<3");
query.setFirstResult(0);
query.setMaxResults(10); // 等同於 limit 0,10
//兩種查詢結果list、uniqueResult
// List list = query.list(); // 查詢的結果是一個List集合
// Employee employee = (Employee) query.uniqueResult();// 查詢的結果是惟一的一個結果,當結果有多個,就會拋異常

// 6,方法鏈
List list = session.createQuery(//
		"FROM Employee e")//
		.setFirstResult(0)//
		.setMaxResults(10)//
		.list();

// 7,彙集函數:count(), max(), min(), avg(), sum()
hql = "SELECT COUNT(*) FROM Employee"; // 返回的結果是Long型的
hql = "SELECT min(id) FROM Employee"; // 返回的結果是id屬性的類型

//8,分組: Group By ... Having
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";
hql = "SELECT e.name,COUNT(e.id) " + //
	 "FROM Employee e " + //
	 "WHERE id<9 " + //
	 "GROUP BY e.name " + //
	 "HAVING count(e.id)>1 " + //
	 "ORDER BY count(e.id) ASC";
hql = "SELECT e.name,COUNT(e.id) AS c " + //
	 "FROM Employee e " + //
	 "WHERE id<9 " + //
	 "GROUP BY e.name " + //
	 "HAVING count(e.id)>1 " + // 在having子句中不能使用列別名
	 "ORDER BY c ASC"; // 在orderby子句中能夠使用列別名

// 9,鏈接查詢 / HQL是面向對象的查詢
 //>> 內鏈接(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";

// 10,查詢時使用參數
// >> 方式一:使用'?'佔位
 hql = "FROM Employee e WHERE id BETWEEN ? AND ?";
 List list2 = session.createQuery(hql)//
	 .setParameter(0, 5)// 設置參數,第1個參數的索引爲0。
	 .setParameter(1, 15)//
	 .list();

// >> 方式二:使用變量名
 hql = "FROM Employee e WHERE id BETWEEN :idMin AND :idMax";
 List list3 = session.createQuery(hql)//
	 .setParameter("idMax", 15)//
	 .setParameter("idMin", 5)//
	 .list();

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

// 11,update與delete,不會通知Session緩存
// >> Update
int result = session.createQuery(//
		"UPDATE Employee e SET e.name=? WHERE id>15")//
		.setParameter(0, "無名氏")//
		.executeUpdate(); // 返回int型的結果,表示影響了多少行。
// >> Delete
int result1 = session.createQuery(//
		"DELETE FROM Employee e WHERE id>15")//
		.executeUpdate(); // 返回int型的結果,表示影響了多少行。
相關文章
相關標籤/搜索