---
# System prepended metadata

title: hibernate 2/21 觀念
tags: [hibernate]

---

# hibernate 2/21 觀念
###### tags: `hibernate`

### 114 Hibernate的關聯
![](https://i.imgur.com/ByVX0LY.png)
看需求選擇單向or雙向
一個購物車唯一個物件 購物車內的東東唯數量
多方太多盡量不要用雙向
多對多 [中介表格](https://openhome.cc/Gossip/HibernateGossip/ManyToMany.html)
[關聯介紹](https://notes.andywu.tw/2018/%E8%B3%87%E6%96%99%E5%BA%AB-%E9%97%9C%E8%81%AF%E4%BB%8B%E7%B4%B9-%E4%B8%80%E5%B0%8D%E4%B8%80%E3%80%81%E4%B8%80%E5%B0%8D%E5%A4%9A%E3%80%81%E5%A4%9A%E5%B0%8D%E5%A4%9A/)
[關聯補充](https://hackmd.io/@OceanChiu/ryM5xipxI)

### 115 單向一對一
老師口訣:校長找到學校(物件導向的觀點 校長物件內有學校變數物件)
![](https://i.imgur.com/oPFQpZh.png)
放入檔案
![](https://i.imgur.com/gZDFwmH.png)

### 01 實作邏輯講解
![](https://i.imgur.com/o5DWXhU.png)
校長找的到學校 學校沒有定義校長
老師口訣:一對一 一中有個一
![](https://i.imgur.com/rUmICh9.png)
* 校長有對應學校的主鍵(外鍵)
![](https://i.imgur.com/t24THVk.png)

```clikc=
@OneToOne(cascade=CascadeType.PERSIST)//如果用這個
        session.persist(p1);
	    session.persist(p2);
@OneToOne(cascade=CascadeType.ALL)
        session.save(p1);
	    session.save(p2);
```
先存沒有外鍵的再存有外鍵的

---
sql f7
![](https://i.imgur.com/pqhO2Hq.png)

---
![](https://i.imgur.com/r6ZEF7A.png)
校長的外鍵要=學校的主鍵

#### sql
![](https://i.imgur.com/5Syw6E6.png)
#### 01 Merge
![](https://i.imgur.com/4XPA39V.png)
![](https://i.imgur.com/ApknI5e.png)
![](https://i.imgur.com/25vZRlb.png)
#### 01 Delete
![](https://i.imgur.com/1Yr7K9v.png)
1. 校長表格有定義學校表格(學校表格會不能刪)
2. 有連動性不能刪除
3. 校長會找不道對應的表格
4. 先刪校長表格在刪學校表格
---
![](https://i.imgur.com/dNkbSf6.png)
如果沒有編寫cascade= { CascadeType.REMOVE})，則只會刪除校長物件對應的紀錄。

#### 02 實作邏輯
![](https://i.imgur.com/mXpFk3L.png)
![](https://i.imgur.com/SekbSzK.png)
一對一 兩邊其中一邊有外鍵就好 @JoinColumn
* **(重要)**
  * mappedBy(本類別沒有外鍵資訊)  = "school_p"(變數) 
  * PrincipalBi principal;(外鍵資訊)
---
![](https://i.imgur.com/niJH6AV.png)
#### 128.129 單向一對多
![](https://i.imgur.com/zHnRvF7.png)
![](https://i.imgur.com/hD2XpQB.png)
1. 一對多有單向雙向
2. 多對一也有單向雙向
![](https://i.imgur.com/vAoMaZ7.png)
* **FK**
    * fk會出現在多方類別對應的表格 
    * @joinColumn 外鍵會出現在本註釋對應的表格裡面

#### 130 實作畫面單向一對多
![](https://i.imgur.com/tAm3GpZ.png)
![](https://i.imgur.com/2V0wqVE.png)
![](https://i.imgur.com/sd05d5L.png)
![](https://i.imgur.com/SaSKpUu.png)
![](https://i.imgur.com/NXCfXfK.png)
唯一特例 單向一對多
![](https://i.imgur.com/AMmgsH2.png)
* 單向的一對多 多方不能定義單向的物件參考
* 多方不能寫註釋
#### 雙向一對多
多方類別要定義一個一方的類別參考
一找到多 多找到一
![](https://i.imgur.com/7dP8lRB.png)
一方不能寫任何註釋
* **外鍵**
    * 外鍵永遠在多方的概念
    * 一方有外鍵 雙方都能有關連

![](https://i.imgur.com/Ygd3SSj.png)
_p 讓他知道外鍵是誰
![](https://i.imgur.com/KAWlMRH.png)

#### 單向多對一
![](https://i.imgur.com/P3G7FpZ.png)
* 口訣: 多對一，多方有個儲存ㄧ方物件參考實例變數，簡稱『多方有個一』![](https://i.imgur.com/xNLzBGJ.png)
* 多能找到一 一不能找到多
![](https://i.imgur.com/L8cwBmx.png)
---
sql
![](https://i.imgur.com/EXtMIEt.png)

---
![](https://i.imgur.com/vtAjFvw.png)
修改
![](https://i.imgur.com/txIB5ws.png)

* Console
先新增沒外鍵的 在新增外鍵的
```clike=
得到Session物件
Hibernate: 
    insert 
    into
        Department_Table
        (depName) 
    values
        (?)
Hibernate: 
    insert 
    into
        Employee_Table
        (department_FK_126, employee_Id, empName) 
    values
        (?, ?, ?)
Hibernate: 
    insert 
    into
        Employee_Table
        (department_FK_126, employee_Id, empName) 
    values
        (?, ?, ?)
Hibernate: 
    insert 
    into
        Department_Table
        (depName) 
    values
        (?)
Hibernate: 
    insert 
    into
        Employee_Table
        (department_FK_126, employee_Id, empName) 
    values
        (?, ?, ?)
Hibernate: 
    insert 
    into
        Employee_Table
        (department_FK_126, employee_Id, empName) 
    values
        (?, ?, ?)
Hibernate: 
    insert 
    into
        Employee_Table
        (department_FK_126, employee_Id, empName) 
    values
        (?, ?, ?)
關閉SessionFactory
```
#### 多對多
![](https://i.imgur.com/NdpU8jG.png)
* **joinColumn(s)**
    * 對方可能是複合主鍵
    * ![](https://i.imgur.com/9TZ79sp.png)
    * 在Join Table中，儲存本類別之主鍵值的外鍵欄位名稱
* **inverseJoinColumn**
    * 在Join Table中，儲存對應對照類別之主鍵值的外鍵欄位名稱

![](https://i.imgur.com/pTnEJQc.png)

```clike=
Hibernate: 
    
    create table author_book (
       FK_BOOK_ID_126_B int not null,
        FK_AUTHOR_ID_126_A int not null,
        primary key (FK_BOOK_ID_126_B, FK_AUTHOR_ID_126_A)//複合主鍵
    )
    Hibernate: 
    
    alter table author_book//中介表格 
       add constraint FK5f5qmsmijrwrtcjrodipp6gm7//這個東東 是Hibernate算出來的外鍵名稱 
       foreign key (FK_AUTHOR_ID_126_A)//對照作者表格 
       references Author_M2M_01_ANNO
       
```
![](https://i.imgur.com/JRd7o1S.png)

---
#### sql
![](https://i.imgur.com/m5o8lUJ.png)
![](https://i.imgur.com/j3WvRgS.png)
* 中介表格放兩邊的主鍵

#### 162 Hibernate Query Language
![](https://i.imgur.com/JX7eWsB.png)
* 查詢出來的物件 通通都是永續物件
#### 163 Query介面
![](https://i.imgur.com/2R6gBSz.png)
#### 164 執行HQL的步驟
![](https://i.imgur.com/fy13KLC.png)
* setFirstResult
     1. (分頁)
     2. 0開頭 
     3. 編號
* setMaxResult
     1. (最多幾筆)
     2. 數量
#### 165 Qurey介面常用的方法
R=永續類別
![](https://i.imgur.com/2jKKsAC.png)

### 實作Query介面
![](https://i.imgur.com/jHIdzwf.png)
修改
![](https://i.imgur.com/NsLfZCc.png)

#### 167 HQL查詢傳回值的型態
![](https://i.imgur.com/sMLpaC4.png)
查詢標的為類別(效能最好)
元素是字串型態的陣列
#### 168 HQL的FROM子句
![](https://i.imgur.com/9u7bDgL.png)
上班寫別名比較好(效能較好)
#### 169 HQL的SELECT子句
![](https://i.imgur.com/GrAirBa.png)

### 實作
![](https://i.imgur.com/jNo95tY.png)
* 合體
![](https://i.imgur.com/dm81J3u.png)
![](https://i.imgur.com/Px8CbsM.png)
![](https://i.imgur.com/Ot1px3z.png)
```clike=
package ch06;

import java.util.List;

import org.hibernate.Session;
import org.hibernate.Transaction;

import ch06.model.Employee;

public class HibernateQueryExercise126_01 {

	@SuppressWarnings("unchecked")
	public static void main(String[] args) {
		Session session = HibernateUtils.getSessionFactory().getCurrentSession();
		//兩種寫法
		String hql = "FROM Employee AS e";
//		String hql = "FROM Employee e";
		
		
//		Object obj = new Object();
		Transaction tx = null;
		try {
		   tx = session.beginTransaction();	
		   List<Employee>emps = session.createQuery(hql).getResultList();
		   for (Employee e :emps) {
			   System.out.println(e.getId()+","+e.getName()+","
					   			 +e.getSalary()+","+e.getBirthday());
		   }
		   tx.commit();
		} catch(Exception e) {
        e.printStackTrace();
			if (tx != null) {
				tx.rollback();
			}
		}
		
	}

}

```
```clike=
package ch06;

import java.util.List;

import org.hibernate.Session;
import org.hibernate.Transaction;


public class HibernateQueryExercise126_02 {

	@SuppressWarnings("unchecked")
	public static void main(String[] args) {
		Session session = HibernateUtils.getSessionFactory().getCurrentSession();
		String hql = "SELECT e.name FROM Employee e";
		Transaction tx = null;
		try {
		   tx = session.beginTransaction();	
		   List<String> names = session.createQuery(hql).getResultList();
		   for (String name : names) {
			   System.out.println(name);
		   }
		   tx.commit();
		} catch(Exception e) {
        e.printStackTrace();
			if (tx != null) {
				tx.rollback();
			}
		}
		
	}

}

```
```clike=
package ch06;

import java.util.List;

import org.hibernate.Session;
import org.hibernate.Transaction;


public class HibernateQueryExercise126_03 {

	@SuppressWarnings("unchecked")
	public static void main(String[] args) {
		Session session = HibernateUtils.getSessionFactory().getCurrentSession();
		String hql = "SELECT e.salary FROM Employee AS e";
		Transaction tx = null;
		try {
		   tx = session.beginTransaction();	
		   List<Integer> salaries = session.createQuery(hql).getResultList();
		   for (Integer salary : salaries) {
			   System.out.println(salary);
		   }
		   tx.commit();
		} catch(Exception e) {
        e.printStackTrace();
			if (tx != null) {
				tx.rollback();
			}
		}
		
	}

}

```
查詢多個
![](https://i.imgur.com/P3vRi1v.png)
```clike=
package ch06;

import java.util.List;

import org.hibernate.Session;
import org.hibernate.Transaction;


public class HibernateQueryExercise126_03 {

	@SuppressWarnings("unchecked")
	public static void main(String[] args) {
		Session session = HibernateUtils.getSessionFactory().getCurrentSession();
		String hql = "SELECT e.name, e.salary, e.birthday FROM Employee AS e";
		Transaction tx = null;
		try {
		   tx = session.beginTransaction();	
		   List< Object[] > list = session.createQuery(hql).getResultList();//list裡面每個元素都是字串物件
		   for (Object[] objs : list) {
			   System.out.println(objs[0]+","+objs[1]+","+objs[2]);
		   }
		   tx.commit();
		} catch(Exception e) {
        e.printStackTrace();
			if (tx != null) {
				tx.rollback();
			}
		}
		
	}

}

```
####  HQL的WHERE子句
![](https://i.imgur.com/ETteZvX.png)
* 實作
    * ![](https://i.imgur.com/wmwvkBA.png) 

```click=
 package ch06;

import java.util.List;

import org.hibernate.Session;
import org.hibernate.Transaction;

import ch06.model.Employee;


public class HibernateQueryExercise126_04 {

	@SuppressWarnings("unchecked")
	public static void main(String[] args) {
		Session session = HibernateUtils.getSessionFactory().getCurrentSession();
		String hql = "FROM Employee e WHERE e.salary >= 30000 and e.name like '黃%' ";
		Transaction tx = null;
		try {
		   tx = session.beginTransaction();	
		   //用操作物件來操作表格內的物件
		   List< Employee > emps = session.createQuery(hql).getResultList();//list裡面每個元素都是字串物件
		   for (Employee emp : emps) {
			   System.out.println(emp.getId()+","+emp.getName()+","+emp.getBirthday());
		   }
		   tx.commit();
		} catch(Exception e) {
        e.printStackTrace();
			if (tx != null) {
				tx.rollback();
			}
		}
		
	}

}
```
#### 172 HQL的ORDER BY子句
![](https://i.imgur.com/wn40dMK.png)
實作
```clike=
package ch06;

import java.util.List;

import org.hibernate.Session;
import org.hibernate.Transaction;

import ch06.model.Employee;


public class HibernateQueryExercise126_05 {

	@SuppressWarnings("unchecked")
	public static void main(String[] args) {
		Session session = HibernateUtils.getSessionFactory().getCurrentSession();
		String hql = "FROM Employee e WHERE e.salary >= 30000 ORDER BY e.birthday DESC, e.salary ";//DESC由大到小//ASC由小到大
		Transaction tx = null;
		try {
		   tx = session.beginTransaction();	
		   //用操作物件來操作表格內的物件
		   List< Employee > emps = session.createQuery(hql).getResultList();//list裡面每個元素都是字串物件
		   for (Employee emp : emps) {
			   System.out.println(emp.getId()+","+emp.getName()+","+emp.getBirthday());
		   }
		   tx.commit();
		} catch(Exception e) {
        e.printStackTrace();
			if (tx != null) {
				tx.rollback();
			}
		}
		
	}

}

```

[聚合函數](https://ithelp.ithome.com.tw/articles/10218055)
[補充](https://rileylin91.github.io/2020/06/12/MSSQL-13-AggregateFunctions/)
n個數字變成n個數字
```clike=
package ch06;

import java.util.List;

import org.hibernate.Session;
import org.hibernate.Transaction;




public class HibernateQueryExercise126_06 {

	@SuppressWarnings("unchecked")
	public static void main(String[] args) {
		Session session = HibernateUtils.getSessionFactory().getCurrentSession();
		String hql = "SELECT SUM(e.salary), MIN(e.salary), MAX(e.birthday),count(*) FROM Employee e";//聚合函數
		Transaction tx = null;
		try {
		   tx = session.beginTransaction();	
		   //用操作物件來操作表格內的物件
		   List< Object[] > list = session.createQuery(hql).getResultList();//list裡面每個元素都是字串物件
		   for (Object[] objs : list) {
			   System.out.println(objs[0]+","+objs[1]+","+objs[2]+","+objs[3]);
		   }
		   tx.commit();
		} catch(Exception e) {
        e.printStackTrace();
			if (tx != null) {
				tx.rollback();
			}
		}
		
	}

}

```
多個聚合分類查詢
```clike=
package ch06;

import java.util.List;

import org.hibernate.Session;
import org.hibernate.Transaction;



public class HibernateQueryExercise126_07 {

	@SuppressWarnings("unchecked")
	public static void main(String[] args) {
		Session session = HibernateUtils.getSessionFactory().getCurrentSession();
		//SELECT 只能用 GROUP BY e.depId 去分類 
		String hql = "SELECT e.depId, SUM(e.salary), MIN(e.salary), MAX(e.birthday),count(*) "
				+ "FROM Employee e GROUP BY e.depId";//GROUP BY拿有重複地去比較(合理的)
		Transaction tx = null;
		try {
		   tx = session.beginTransaction();	
		   //用操作物件來操作表格內的物件
		   List< Object[] > list = session.createQuery(hql).getResultList();//list裡面每個元素都是字串物件
		   for (Object[] objs : list) {
			   System.out.println(objs[0]+","+objs[1]+","+objs[2]+","+objs[3]+","+objs[4]);
		   }
		   tx.commit();
		} catch(Exception e) {
        e.printStackTrace();
			if (tx != null) {
				tx.rollback();
			}
		}
		
	}

}

```
---
如果多了e.name
![](https://i.imgur.com/8cEJQcO.png)

#### 使用參數
加參數
![](https://i.imgur.com/OaTxl2z.png)
```clike=
package ch06;

import java.util.List;

import org.hibernate.Session;
import org.hibernate.Transaction;

import ch06.model.Employee;



public class HibernateQueryExercise126_08 {

	@SuppressWarnings("unchecked")
	public static void main(String[] args) {
		Session session = HibernateUtils.getSessionFactory().getCurrentSession();
		//SELECT 只能用 GROUP BY e.depId 去分類 
		String hql = "FROM Employee AS e WHERE e.id = :empId";//參數
		Transaction tx = null;
		try {
		   tx = session.beginTransaction();	
		   //用操作物件來操作表格內的物件
		   List< Employee > emps = session.createQuery(hql).setParameter("empId", 5).getResultList();
		   for (Employee e : emps) {
			   System.out.println(e.getId()+","+e.getName()+","+e.getSalary()+","+e.getBirthday());
		   }
		   tx.commit();
		} catch(Exception e) {
        e.printStackTrace();
			if (tx != null) {
				tx.rollback();
			}
		}
		
	}

}

```
查詢不同參數變化
```clike=
package ch06;

import java.util.List;

import org.hibernate.Session;
import org.hibernate.Transaction;

import ch06.model.Employee;



public class HibernateQueryExercise126_09 {

	@SuppressWarnings("unchecked")
	public static void main(String[] args) {
		Session session = HibernateUtils.getSessionFactory().getCurrentSession();
		//SELECT 只能用 GROUP BY e.depId 去分類 
		String hql = "FROM Employee AS e WHERE e.salary >= :empSalary";//參數
		Transaction tx = null;
		try {
		   tx = session.beginTransaction();	
		   //用操作物件來操作表格內的物件
		   List< Employee > emps = session.createQuery(hql).setParameter("empSalary", 3000).getResultList();
		   for (Employee e : emps) {
			   System.out.println(e.getId()+","+e.getName()+","+e.getSalary()+","+e.getBirthday());
		   }
		   tx.commit();
		} catch(Exception e) {
        e.printStackTrace();
			if (tx != null) {
				tx.rollback();
			}
		}
		
	}

}

```
#### HQL不支援?
![](https://i.imgur.com/WeRYayn.png)

#### update子句
![](https://i.imgur.com/TJHtP7l.png)
```clike=
package ch06;

import java.util.List;

import org.hibernate.Session;
import org.hibernate.Transaction;

import ch06.model.Employee;



public class HibernateQueryExercise126_10 {

	@SuppressWarnings("unchecked")
	public static void main(String[] args) {
		Session session = HibernateUtils.getSessionFactory().getCurrentSession();
		//SELECT 只能用 GROUP BY e.depId 去分類 
		String hql = "UPDATE Employee AS e SET e.salary = e.salary + :sal "
					+ " WHERE e.id = :empId";//先更新
		String hql1 = "FROM Employee AS e WHERE e.id = :empId";//更新結果
		Transaction tx = null;
		try {
		   tx = session.beginTransaction();	
		   //用操作物件來操作表格內的物件
		    session.createQuery(hql)
				   				.setParameter("sal", 4000)
				   				.setParameter("empId", 5)
				   				.executeUpdate();
		    List<Employee> emps = session.createQuery(hql1)
				.setParameter("empId", 5)
				.getResultList();
			for (Employee e : emps) {
			   System.out.println(e.getId()+","+e.getName()+","+e.getSalary()+","+e.getBirthday());
		   }
		   tx.commit();
		} catch(Exception e) {
			e.printStackTrace();
			if (tx != null) {
				tx.rollback();
			}
		}
		
	}

}

```
#### 實作getSingleResult()傳回值單一物件
![](https://i.imgur.com/nQg4I2k.png)
```clike=
package ch06;


import javax.persistence.NoResultException;
import javax.persistence.NonUniqueResultException;

import org.hibernate.Session;
import org.hibernate.Transaction;

import ch06.model.Employee;



public class HibernateQueryExercise126_11 {
	public static void main(String[] args) {
		Session session = HibernateUtils.getSessionFactory().getCurrentSession();
		String hql1 = "FROM Employee AS e WHERE e.id = :empId";//更新結果
		Transaction tx = null;
		Employee emp = null;
		try {
		   tx = session.beginTransaction();	
		   try {
			
		    emp = (Employee) session.createQuery(hql1)
				.setParameter("empId", 1)
				.getSingleResult();//傳回值單一物件
		   } catch (NoResultException e) {
			   System.out.println("查詢此筆紀錄");
		   }catch (NonUniqueResultException e) {
			System.out.println("查出多筆紀錄");
		}
		    if(emp != null) {
			   System.out.println(emp.getId()+","+emp.getName()+","+emp.getSalary()+","+emp.getBirthday());
		    }else {
				System.out.println("查詢發生異常");
			}
		   tx.commit();
		} catch(Exception e) {
			e.printStackTrace();
			if (tx != null) {
				tx.rollback();
			}
		}
		
	}

}

```
```clike=
package ch06;


import javax.persistence.NoResultException;
import javax.persistence.NonUniqueResultException;

import org.hibernate.Session;
import org.hibernate.Transaction;

import ch06.model.Employee;



public class HibernateQueryExercise126_12 {
	public static void main(String[] args) {
		Session session = HibernateUtils.getSessionFactory().getCurrentSession();
		String hql1 = "FROM Employee AS e WHERE e.depId = :did";//更新結果
		Transaction tx = null;
		Employee emp = null;
		try {
		   tx = session.beginTransaction();	
		   try {
			
		    emp = (Employee) session.createQuery(hql1)
				.setParameter("did", 1)
				.getSingleResult();//傳回值單一物件
		   } catch (NoResultException e) {
			   System.out.println("查詢此筆紀錄");
		   }catch (NonUniqueResultException e) {
			System.out.println("查出多筆紀錄");
		}
		    if(emp != null) {
			   System.out.println(emp.getId()+","+emp.getName()+","+emp.getSalary()+","+emp.getBirthday());
		    }else {
				System.out.println("查詢發生異常");
			}
		   tx.commit();
		} catch(Exception e) {
			e.printStackTrace();
			if (tx != null) {
				tx.rollback();
			}
		}
		
	}

}

```
#### getResultList();0筆或多筆
```
clike=
package ch06;


import java.util.List;



import org.hibernate.Session;
import org.hibernate.Transaction;

import ch06.model.Employee;



public class HibernateQueryExercise126_13 {
	@SuppressWarnings("unchecked")
	public static void main(String[] args) {
		Session session = HibernateUtils.getSessionFactory().getCurrentSession();
		String hql1 = "FROM Employee AS e WHERE e.depId = :did";//更新結果
		Transaction tx = null;
		List<Employee> emps = null;
		try {
		   tx = session.beginTransaction();	
			    emps = session.createQuery(hql1)
				.setParameter("did", 1)
				.getResultList();//0筆或多筆
		
		    if(emps.size() > 0) {
		    	for(Employee emp : emps) {
			   System.out.println(emp.getId()+","+emp.getName()+","+emp.getSalary()+","+emp.getBirthday());
		    	}
		    }else {
				System.out.println("查無此部門代號之員工");
			}
		   tx.commit();
		} catch(Exception e) {
			e.printStackTrace();
			if (tx != null) {
				tx.rollback();
			}
		}
		
	}

}

```
簡化try
```clike=
package ch06;


import java.util.List;



import org.hibernate.Session;
import org.hibernate.Transaction;

import ch06.model.Employee;



public class HibernateQueryExercise126_14 {
	@SuppressWarnings("unchecked")
	public static void main(String[] args) {
		Session session = HibernateUtils.getSessionFactory().getCurrentSession();
		String hql1 = "FROM Employee AS e WHERE e.id = :empId";//更新結果
		Transaction tx = null;
		List<Employee> emps = null;
		try {
		   tx = session.beginTransaction();	
			    emps = session.createQuery(hql1)
				.setParameter("did", 2)
				.getResultList();//0筆或多筆
		
		    if(emps.size() > 0) {
		    	System.out.println("查詢之員工如下");
		    	Employee emp = emps.get(0);
		    	
			   System.out.println(emp.getId()+","+emp.getName()+","+emp.getSalary()+","+emp.getBirthday());
		    	
		    }else {
				System.out.println("查無此部門代號之員工");
			}
		   tx.commit();
		} catch(Exception e) {
			e.printStackTrace();
			if (tx != null) {
				tx.rollback();
			}
		}
		
	}

}

```
#### 177 DELETE
```clike=
package ch06;

import java.util.List;

import org.hibernate.Session;
import org.hibernate.Transaction;

import ch06.model.Employee;



public class HibernateQueryExercise126_15 {

	@SuppressWarnings("unchecked")
	public static void main(String[] args) {
		Session session = HibernateUtils.getSessionFactory().getCurrentSession();
		//SELECT 只能用 GROUP BY e.depId 去分類 
		String hql = "DELETE FROM Employee e WHERE e.name = :empName ";
		String hql1 = "FROM Employee ";
		Transaction tx = null;
		try {
		   tx = session.beginTransaction();	
		   //用操作物件來操作表格內的物件
		    session.createQuery(hql)
				   				.setParameter("empName", "黃明和")
				   				.executeUpdate();
		    List<Employee> emps = session.createQuery(hql1)
		    						.getResultList();
			for (Employee e : emps) {
			   System.out.println(e.getId()+","+e.getName()+","+e.getSalary()+","+e.getBirthday());
		   }
		   tx.commit();
		} catch(Exception e) {
			e.printStackTrace();
			if (tx != null) {
				tx.rollback();
			}
		}
		
	}

}

```
#### 178 INSERT INTO
![](https://i.imgur.com/tXPBOE3.png)

#### 179 分頁
![](https://i.imgur.com/if9822h.png)
```clike=
package ch06;

import java.util.List;

import org.hibernate.Session;
import org.hibernate.Transaction;

import ch06.model.Employee;

public class HibernateQueryExercise126_16 {

	@SuppressWarnings("unchecked")
	public static void main(String[] args) {
		Session session = HibernateUtils.getSessionFactory().getCurrentSession();
		String hql = "FROM Employee AS e";

		Transaction tx = null;
		try {
		   tx = session.beginTransaction();	
		   List<Employee>emps = session.createQuery(hql)
				   					   .setFirstResult(4)
				   					   .setMaxResults(2)
				   					   .getResultList();
		   for (Employee e :emps) {
			   System.out.println(e.getId()+","+e.getName()+","
					   			 +e.getSalary()+","+e.getBirthday());
		   }
		   tx.commit();
		} catch(Exception e) {
			e.printStackTrace();
			if (tx != null) {
				tx.rollback();
			}
		}
		
	}

}

```
#### Native Query
![](https://i.imgur.com/Uif2BSB.png)
```clike=
package ch06;

import java.util.List;

import org.hibernate.Session;
import org.hibernate.Transaction;

import ch06.model.Employee;

public class HibernateQueryExercise126_17 {

	@SuppressWarnings("unchecked")
	public static void main(String[] args) {
		Session session = HibernateUtils.getSessionFactory().getCurrentSession();
		String sql = "SELECT e.depId, e.name, e.birthday, e.salary FROM EMPLOYEE_Ch06 AS e";

		Transaction tx = null;
		try {
		   tx = session.beginTransaction();	
		   List<Object[]>emps = session.createNativeQuery(sql)
				   					   .setFirstResult(0)
				   					   .setMaxResults(2)
				   					   .getResultList();
		   
		   for (Object[] oa : emps) {
			   System.out.println(oa[0]+","+oa[1]+","+oa[2]+","+oa[3]);
			 }
		   tx.commit();
		} catch(Exception e) {
			e.printStackTrace();
			if (tx != null) {
				tx.rollback();
			}
		}
		
	}

}

```