第三章:Hibernate HQL詳解

一)HQL簡介

Hibernate查詢語言(HQL)是一種面向對象的查詢語言,和數據庫SQL類似。區別在於HQL是針對於實體類的屬性操作。 HQL查詢被Hibernate翻譯爲傳統的SQL查詢,從而對數據庫進行操作。

 

二)HQL查詢

FORM語句

方式一:查詢整個實體類對象

String hql = "FROM EmployeeEntity";
Query query = session.createQuery(hql);
List<EmployeeEntity> list = query.getResultList();

 

方式二:使用完全限定名

String hql = "FROM com.oyj.hibernate.entity.EmployeeEntity";
Query query = session.createQuery(hql);
List<EmployeeEntity> list = query.getResultList();

 

AS語句

方式一:直接用AS指定別名,當HQL太長時,能簡化代碼

String hql = "FROM EmployeeEntity AS E";
Query query = session.createQuery(hql);
List<EmployeeEntity> list = query.getResultList();

 

方式二:省略AS

String hql = "FROM EmployeeEntity E";
Query query = session.createQuery(hql);
List<EmployeeEntity> list = query.getResultList();

 

SELECT語句

當查詢具體字段時,返回的結果集是一個Object[]數組,不然強制轉換的時候會報錯

String hql = "SELECT E.userID, E.userName, E.sex FROM EmployeeEntity E";
Query query = session.createQuery(hql);
List list = query.getResultList();
			
Iterator<Object[]> it = list.iterator();
while (it.hasNext()) {
    Object[] obj = it.next();
    System.out.println(obj[0] + "----" + obj[1] + "----" + obj[2]);
}

 

WHERE語句

方式一:直接拼接條件,該問題可能會導致SQL注入問題

String hql = "FROM EmployeeEntity E WHERE E.userID=999999";
Query query = session.createQuery(hql);
List list = query.getResultList();

 

方式二:使用“:”佔位符

String hql = "FROM EmployeeEntity E WHERE E.userID = :userids";
Query query = session.createQuery(hql);
query.setParameter("userids", 999999);
List list = query.getResultList();

 

WHERE LIKE語句

String hql = "SELECT E.userID, E.userName, E.sex FROM EmployeeEntity E WHERE E.userName like :username";
Query query = session.createQuery(hql);
query.setParameter("username", "%" + "cb" + "%");
List list = query.getResultList();

 

WHERE IN語句

String hql = "SELECT E.userID, E.userName, E.sex FROM EmployeeEntity E WHERE E.userID in (:userIDs)";
Query query = session.createQuery(hql);
query.setParameterList("userIDs", new Integer[] {1, 2, 3});
List list = query.getResultList();

 

ORDER BY語句

對某字段排序,ASC爲升序,DESC爲降序,如需要對多個字段排序,用逗號分割

String hql = "FROM EmployeeEntity E WHERE E.userID = :userids ORDER BY E.userID DESC, E.userName ASC";
Query query = session.createQuery(hql);
query.setParameter("userids", 999999);
List list = query.getResultList();

 

GROUP BY語句

對某字段分組,把數據一致歸爲一類,多個字段用逗號分割

String hql = "SELECT E.userID, E.userName, E.sex FROM EmployeeEntity E GROUP BY E.userID, E.userName, E.sex";
Query query = session.createQuery(hql);
List list = query.getResultList();

 

分頁語句

setFirstResult:默認從0開始,0表示爲第一頁

setMaxResults:每一頁展示的最大數量,大於0

String hql = "SELECT E.userID, E.userName, E.sex FROM EmployeeEntity E";
Query query = session.createQuery(hql);
query.setFirstResult(0);
query.setMaxResults(10);
List list = query.getResultList();

 

聚合函數

COUNT

String hql = "SELECT COUNT(E) FROM EmployeeEntity E";
Query query = session.createQuery(hql);
List list = query.getResultList();

函數表

方法 描述
avg(property name) 屬性的平均值
count(property name or *) 屬性在結果中出現的次數
max(property name) 屬性值的最大值
min(property name) 屬性值的最小值
sum(property name) 屬性值的總和

 

三)HQL新增

INSERT INTO語句

HQL不支持insert into 表名(字段1, 字段2) values(值1, 值2)格式,只有當記錄從一個對象插入到另一個對象時才支持INSERT INTO語句

String hql = "INSERT INTO EmployeeEntity(userID, userName, sex) "
                + "SELECT E.userID, E.userName, E.sex FROM EmployeeEntity E";
Query query = session.createQuery(hql);
int result = query.executeUpdate();

 

四)HQL修改

UPDATE語句

根據指定的條件修改數據

String hql = "UPDATE EmployeeEntity E set E.userName = :username where E.userID = :userIDs";
Query query = session.createQuery(hql);
query.setParameter("username", "ttttt");
query.setParameter("userIDs", 999111);
int result = query.executeUpdate();

 

五)HQL刪除

DELETE語句

根據指定的條件刪除數據。需注意,刪除操作一定要帶條件,不然容易誤刪整個表的數據

String hql = "DELETE FROM EmployeeEntity E where E.userID = :userIDs";
Query query = session.createQuery(hql);
query.setParameter("userIDs", 999111);
int result = query.executeUpdate();

 

識別二維碼關注個人微信公衆號

本章完結,待續,歡迎轉載!
 
本文說明:該文章屬於原創,如需轉載,請標明文章轉載來源!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章