1. 程式人生 > >Hibernate中的HQL的基本常用小例子,單表查詢與多表查詢

Hibernate中的HQL的基本常用小例子,單表查詢與多表查詢

<span style="font-size:24px;color:#3366ff;">本文章實現HQL的以下功能:</span>
/**
 * hql語法:
 *   1)單表查詢
 *   	 1.1 全表查詢
 *       1.2 指定欄位查詢
 *       1.3 排除重複記錄
 *       1.4 條件查詢(重點)
 *       1.5 分頁查詢
 *       1.6 聚合查詢
 *       1.7 查詢排序
 *       1.8 分組查詢
 *       1.9 分組後篩選
 *       
 *   2)多表查詢
 *       1.1 內連線
 *       1.2 左外連線/右外連線   
*/
</span>


首先要配置Hibernate的xml檔案,讓兩個資料庫建立聯絡,是一對多的對映連線

Employee.hbm.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd" >
<hibernate-mapping>
	<class name="star.july.d_hql.Employee" table="employee">
		<id name="id">
			<generator class="native"></generator>
		</id>
		<property name="name"></property>
		<property name="gender"></property>
		<property name="title"></property>
		<property name="email"></property>
		<property name="salary"></property>
		<many-to-one name="dept" 
			class="star.july.d_hql.Dept"
			column="deptId"
		></many-to-one>
	</class>
</hibernate-mapping>

Dept.hbm.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd" >
<hibernate-mapping>
	<class name="star.july.d_hql.Dept" table="dept">
		<id name="id">
			<generator class="native"></generator>
		</id>
		<property name="deptName" column="name">
		</property>
		<set name="employee"
			cascade="all"
		>
		<key column="id"></key>
			<one-to-many class="star.july.d_hql.Employee"
			/>
		</set>
	</class>
</hibernate-mapping>


再建立兩個實體類

Employee.java

package star.july.d_hql;

public class Employee {
	private int id;
	private String name;
	private String gender;
	private String title;
	private String email;
	private double salary;
	private Dept dept = new Dept();
	
	public Dept getDept() {
		return dept;
	}
	public void setDept(Dept dept) {
		this.dept = dept;
	}
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getGender() {
		return gender;
	}
	public void setGender(String gender) {
		this.gender = gender;
	}
	public String getTitle() {
		return title;
	}
	public void setTitle(String title) {
		this.title = title;
	}
	public String getEmail() {
		return email;
	}
	public void setEmail(String email) {
		this.email = email;
	}
	public double getSalary() {
		return salary;
	}
	public void setSalary(double salary) {
		this.salary = salary;
	}
	@Override
	public String toString() {
		return "Employee [id=" + id + ", name=" + name + ", gender=" + gender
				+ ", title=" + title + ", email=" + email + ", salary="
				+ salary + "]";
	}
	
	
}


Dept.java

package star.july.d_hql;

import java.util.HashSet;
import java.util.Set;

public class Dept {
	private int id;
	private String deptName;
	private Set<Employee> employee = new HashSet<Employee>();
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public String getDeptName() {
		return deptName;
	}
	public void setDeptName(String deptName) {
		this.deptName = deptName;
	}
	public Set<Employee> getEmployee() {
		return employee;
	}
	public void setEmployee(Set<Employee> employee) {
		this.employee = employee;
	}
	
	
}	


最後測試HQL:

Demo.java

package star.july.d_hql;

import java.util.List;
import java.util.Set;

import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.junit.Test;

import star.july.util.HibernateUtil;
/**
 * hql語法:
 *   1)單表查詢
 *   	 1.1 全表查詢
 *       1.2 指定欄位查詢
 *       1.3 排除重複記錄
 *       1.4 條件查詢(重點)
 *       1.5 分頁查詢
 *       1.6 聚合查詢
 *       1.7 查詢排序
 *       1.8 分組查詢
 *       1.9 分組後篩選
 *       
 *   2)多表查詢
 *       1.1 內連線
 *       1.2 左外連線/右外連線   
 *       *
 */      
public class Demo {
	@Test
	public void test(){
		Session session = HibernateUtil.getSession();
		Transaction ts = session.getTransaction();
		try{
			ts.begin();
			//hql基本語法
			//1、建立一個Query物件
			//引數:需要執行的hql語句
			String hql = "select e from Employee e where id = 1";
			Query query = session.createQuery(hql);
			//2、執行查詢
			//2、1封裝所有
			List<Employee> emp = query.list();
			for(Employee e : emp){
				System.out.println(e);
			}
			
			//2、2 封裝一個(第一個)
			Employee empl = (Employee)query.uniqueResult();
			System.out.println(empl);
			
			ts.commit();
			
		}catch(Exception e){
			e.printStackTrace();
			ts.rollback();
		}
	}
	
	
	//單表查詢
	@Test
	public void test3(){
		Session session = HibernateUtil.getSession();
		Transaction ts = session.getTransaction();
		try{
			ts.begin();
//			 *  1)單表查詢
//			 *   	 1.1 全表查詢
		//	String hql = "from star.july.d_hql.Employee";
			//auto-import:自動到爆,自動在每個包下面搜尋對應這個類的包,多個同名類的報會衝突
//			String hql = "select e from Employee e";
			
//			 *       1.2 指定欄位查詢
			//返回物件陣列
//			String hql = "select e.name,e.title from Employee e";
			
//			 *       1.3 排除重複記錄
//			String hql = "select distinct(e.gender) from Employee e";
			
//			 *       1.4 條件查詢(重點)(where)
			//邏輯條件:and  or
			// 模糊查詢:like: % _
			//比較查詢: < > <= >= between and <>
			//判空查詢: is null ,is not null, ='',<>'';
//			String hql = "select e from Employee e where name like '張%'";
//			String hql = "select e from Employee e where e.gender is null or e.gender=''";
			
//			 *       1.5 分頁查詢
		/*	String hql = "from Employee ";
			Query query = session.createQuery(hql);
			//設定開始讀取行
			query.setFirstResult(0);
			//每頁讀取多少條資訊
			query.setMaxResults(3);*/
			
//			 *       1.6 聚合查詢
			//avg,count,max,min,uniqueResult
//			String hql = "select max(e.salary) from Employee e";
			
//			 *       1.7 查詢排序
			//order by
			//desc:降序  asc:升序
//			String hql = "select e from Employee e order by id desc ";
			
			
//			 *       1.8 分組查詢
//			String hql = "select e from Employee e group by e.gender";
		
//			 *       1.9 分組後篩選
			String hql = "select e from Employee e  where e.gender is not null and e.gender<>'' group by e.gender having count(e.gender)>1";
			
			Query query = session.createQuery(hql);
			
			
			//集合物件
			List<Object> e = query.list();
			for(Object emp : e){
				System.out.println(emp);
			}
			
			
			//物件陣列
		/*	List<Object[]> objects = query.list();
			for(Object[] object : objects){
				for(Object obj:object ){
				System.out.print(obj);
				}
				System.out.println();
			}	*/		
			
			
			//封裝一個物件
			/*Object unique = query.uniqueResult();
			System.out.println(unique);*/
			
			
			
			ts.commit();
		}catch(Exception e){
			e.printStackTrace();
			ts.rollback();
		}
	}
	
	
	//多表查詢
		@Test
		public void test2(){
			Session session = HibernateUtil.getSession();
			Transaction ts = session.getTransaction();
			try{
				ts.begin();
				
				/**
				 *步驟
				 *1、確定查詢哪些物件
				 *2、確定擦汗尋哪些屬性
				 *3、確定連線條件
				 *4、業務條件 
				 */
				//1、內連線查詢
				//效果:只有滿足條件的資料才會被顯示出來
				//查詢員工及其部門:顯示員工名稱,部門名稱
//				String hql = "select e.name,d.deptName from Employee e , Dept d where e.dept.id=d.id";
				//另一種寫法
//				String hql = "select e.name,d.deptName from Employee e inner join e.dept d";
				
				
				//左外連線
				//效果:優先顯示左表,右表的資料匹配顯示,不匹配則顯示null
				//查詢所有部門的員工(沒有員工的部門也要顯示出來)
				String hql = "select d.deptName, e.name from Dept d left outer join d.employee e";
				
				//右外連線
//				String hql = "select d.deptName,e.name from Employee e right outer join e.dept d";
				Query query = session.createQuery(hql);
				
				/*List<Object>  object = query.list();
				for(Object obj:object){
					System.out.println(obj);
				}*/
				
				List<Object[]> objects = query.list();
				for(Object[] object:objects){
					for(Object obj : object){
						System.out.print(obj);
					}
					System.out.println();
				}
				
				
				
				
				ts.commit();
				
			}catch(Exception e){
				e.printStackTrace();
				ts.rollback();
			}
		}
}