Hibernate中常用HQL
阿新 • • 發佈:2019-02-14
HQL是Hibernate自帶的查詢語言
HQL是一種面向物件的查詢語言。SQL的操作物件是資料表和列等資料物件,而HQL的操作物件是類、例項、屬性等。
HQL的語法很像SQL的語法
以下舉例均以學生類為例:Students.java
Java程式碼
1.from子句
規則: from + 持久化類的類名
Java程式碼
2.select子句
規則:select + 持久化類中屬性名(可以多個或一個) + from子句。。。
Java程式碼
下面說一下Select子句的不同返回型別
①Object[]----預設的
②以List
③以map
④自定義
⑤distinct關鍵字
Java程式碼
3.where子句
首先說一下Query兩種引數傳遞方式
①使用‘?’佔位
Java程式碼
②使用變數名
Java程式碼
下面是where子句中的應用(因為跟sql類似就不舉例)
①比較運算
= <> < > <= >=
null值判斷:is null is not null
HQL中可以寫 x = null; / x <> null; 會自動轉換成相應sql
②範圍運算
in() / not in()
between 值1 and 值2
③字串匹配
like關鍵字
萬用字元:"%"---任意字元
"_"---一個字元
④邏輯運算
and or not
⑤集合運算
is empty /is not empty
member of
⑥四則運算
+ - * /
4.order by子句
同sql:對查詢結果排序
desc:降序
esc:升序(預設)
5.分組: Group By ... Having
在having子句中不能使用列別名
在orderby子句中可以使用列別名
Java程式碼
6.聚集函式
count(), max(), min(), avg(), sum()
7.查詢單個物件
Java程式碼
8.連線查詢
HQL是一種面向物件的查詢語言。SQL的操作物件是資料表和列等資料物件,而HQL的操作物件是類、例項、屬性等。
HQL的語法很像SQL的語法
以下舉例均以學生類為例:Students.java
Java程式碼
- private String name;
- private int age;
- public Students(){
- }
- public Students(String name,int age){
- name = this.name;
- age = this.age;
- }
- //get/set方法
-
//。。。。
1.from子句
規則: from + 持久化類的類名
Java程式碼
- //Students 是學生類,直接這麼寫就可以查詢出Students持久化類對應於資料庫表中的所有資訊
- //select可以省略.
- String hql = "from Students";
- String hql = "from Students as s";//使用別名
- String hql = "from Students s";//別名可以省略
- Query query = getCurrentSession().createQuery(hql);
-
//注意:當省略select子句時,直接使用from子句來查詢全部,query.list()返回的是該持久化型別的List
- List<Students> studentsList = query.list();
2.select子句
規則:select + 持久化類中屬性名(可以多個或一個) + from子句。。。
Java程式碼
- //hql中不可以寫 select * 這個實際上是相當於 form Students
- hql = "select s from Students as s";//相當於 from Students
- hql = "select s.name from Students as s";//只查詢一列,返回List<Object>
-
hql = "select s.name,s.age from Students as s"
- hql = "select new Students(s.name,s.age) from Students as s"//自定義返回型別,返回List<Students>,同時在Students.java持久化類中要有相應的構造器和無參構造器
- hql = "select distinct s.name from Students s"//distinct關鍵字,返回List<Object>
下面說一下Select子句的不同返回型別
①Object[]----預設的
②以List
③以map
④自定義
⑤distinct關鍵字
Java程式碼
- //預設的List<Object[]> 返回,此時需要查詢多個屬性,一個屬性的查詢返回的是List<Object>
- hql = "select s.name,s.age from Students s";
- List<Object[]> list = query.list();
- //查詢一個屬性
- hql = "select s.name from Students s";
- List<Object> list = query.list();
- //以list返回
- hql = "select new List (s.name,s.age) from Students s";
- List<List> list = query.list();
- //以map返回:如果查詢欄位屬性不設別名則key值以序號顯示,查詢屬性使用別名,key值以別名顯示
- hql = "select new map(name,age) from Students";
- List<Map> list = query.list();
- list.get(0).get("0");//沒有別名時,key以序號命名
- hql = "select new map(s.name,s.age) from Students s";
- list.get(0).get("name");//通過別名來獲取
- //以自定義的構造器返回:持久化類中必須聲明瞭該構造器和無參構造器
- hql = "select new Students(s.name,s.age) from Students s";
- List<Students> list = query.list();
- //以distinct關鍵字返回
- hql = "select distinct s.name from Students s";
- List<Object> list = query.list();//因為是一個欄位所有返回List<Object>
3.where子句
首先說一下Query兩種引數傳遞方式
①使用‘?’佔位
Java程式碼
- hql = "from Students where name = ? ";
- Query query = getCurrentSession().createQuery(hql);
- query.setParameter(0,"張三",Hibernate.STRING);
- //第一個引數:表示是第幾個'?',從0開始
- //第二個引數:表示實際查詢的內容
- //第三個引數:表示該引數的型別(可以省略)
②使用變數名
Java程式碼
- hql = "from Students where name = :NAME ";
- Query query = getCurrentSession().createQuery(hql);
- query.setParameter("NAME","張三",Hibernate.STRING);
- //第一個引數:與hql中':'後的變數名對應
- //第二個引數:表示實際查詢的內容
- //第三個引數:表示該引數的型別(可以省略)
- //當引數是集合時,一定要使用setParameterList()設定引數值
- hql = "from Students s where name in (:NAME)";
- Query query = getCurrentSession().createQuery(hql);
- query.setParameterList("NAME", new Object[] { "張三","李四"});
下面是where子句中的應用(因為跟sql類似就不舉例)
①比較運算
= <> < > <= >=
null值判斷:is null is not null
HQL中可以寫 x = null; / x <> null; 會自動轉換成相應sql
②範圍運算
in() / not in()
between 值1 and 值2
③字串匹配
like關鍵字
萬用字元:"%"---任意字元
"_"---一個字元
④邏輯運算
and or not
⑤集合運算
is empty /is not empty
member of
⑥四則運算
+ - * /
4.order by子句
同sql:對查詢結果排序
desc:降序
esc:升序(預設)
5.分組: Group By ... Having
在having子句中不能使用列別名
在orderby子句中可以使用列別名
Java程式碼
- hql = "select s.name,count(s.age) from Students s where s.age > 10 group by s.name having count(s.age) > 1 order by s.age";
6.聚集函式
count(), max(), min(), avg(), sum()
7.查詢單個物件
Java程式碼
- hql = "from Students where name = '"張三"'";
- Query query = session.createQuery(hql);
- Students student = query.uniqueResult();
- //當查詢結果不唯一時,會丟擲異常。
8.連線查詢