Hibernate中的HQL的基本常用小例子,單表查詢與多表查詢
阿新 • • 發佈:2019-02-20
<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();
}
}
}