Hibernate是一個開源,輕量級的ORM(對象關(guān)系映射)工具。Hibernate框架簡化了java應(yīng)用程序與數(shù)據(jù)庫交互的開發(fā)。
ORM工具簡化了數(shù)據(jù)創(chuàng)建,數(shù)據(jù)處理和數(shù)據(jù)訪問。它是將對象映射到數(shù)據(jù)庫中存儲的數(shù)據(jù)(表)的編程技術(shù)。
注:為什么會有這篇教程文章?答:只是想寫一篇最NB的Hibernate教程入門文章。NB代表人見人愛,花見花開,車見爆胎,飛鳥落地…,最后,需要注意的是:這篇文章包教不包會!除非你從頭到尾認真看完并運行所有示例代碼。
本教程文章基于以下工具(軟件):
Hibernate.x ~ Hibernate.5 更新功能:
從Hibernate 5.0開始Hibernate Spatial是Hibernate項目的一部分,因此我們也可以處理GIS數(shù)據(jù)了。
域模型映射支持Java 8日期和時間類型。 標準SQL日期/時間類型以及支持的Java 8 Date
/ Time
類類型之間的映射,如下所示:
java.time.LocalDate
java.time.LocalTime
, java.time.OffsetTime
java.time.Instant
, java.time.LocalDateTime
,java.time.OffsetDateTime
和 java.time.ZonedDateTime
字節(jié)碼增強機制從頭重新設(shè)計,Hibernate可支持Maven和Gradle插件??梢酝ㄟ^字節(jié)碼儀器來增強三個主要方面:
LAZY
,只有在第一次被訪問時,它們才被提取。Hibernate的原生API(Session等)已更新為使用泛型類型化。無需在獲取實體時轉(zhuǎn)換。
Hibernate 5.0
將其擴展到更廣泛的類型(例如UUID
)。Hibernate是一個庫,為了處理所有類型的數(shù)據(jù)庫,它不依賴于應(yīng)用程序選擇的任何類型的數(shù)據(jù)庫,如果Java是“一次寫入到處運行”的語言,Hibernate則是“寫一次就可運行在所有類型的數(shù)據(jù)庫“中的框架。
在這篇文章中,使用的是MySQL數(shù)據(jù)(你可使用其它的數(shù)據(jù)庫,如:Oracle,MySQL或SQL Server),并創(chuàng)建一個簡單的數(shù)據(jù)庫:mydb
,完整的數(shù)據(jù)庫創(chuàng)建語句如下所示:
創(chuàng)建數(shù)據(jù):
CREATE DATABASE IF NOT EXISTS mydb default charset utf8 COLLATE utf8_general_ci;
需要創(chuàng)建以下幾張表,它們的關(guān)系圖如下所示 -
創(chuàng)建表語句:
create table DEPARTMENT (
DEPT_ID integer not null,
DEPT_NAME varchar(255) not null,
DEPT_NO varchar(20) not null,
LOCATION varchar(255),
primary key (DEPT_ID),
unique (DEPT_NO)
);
create table EMPLOYEE (
EMP_ID bigint not null,
EMP_NAME varchar(50) not null,
EMP_NO varchar(20) not null,
HIRE_DATE date not null,
IMAGE longblob,
JOB varchar(30) not null,
SALARY float not null,
DEPT_ID integer not null,
MNG_ID bigint,
primary key (EMP_ID),
unique (EMP_NO)
);
create table SALARY_GRADE (
GRADE integer not null,
HIGH_SALARY float not null,
LOW_SALARY float not null,
primary key (GRADE)
);
create table TIMEKEEPER (
Timekeeper_Id varchar(36) not null,
Date_Time datetime not null,
In_Out char(1) not null,
EMP_ID bigint not null,
primary key (Timekeeper_Id)
);
alter table EMPLOYEE
add index FK75C8D6AE269A3C9 (DEPT_ID),
add constraint FK75C8D6AE269A3C9
foreign key (DEPT_ID)
references DEPARTMENT (DEPT_ID);
alter table EMPLOYEE
add index FK75C8D6AE6106A42 (EMP_ID),
add constraint FK75C8D6AE6106A42
foreign key (EMP_ID)
references EMPLOYEE (EMP_ID);
alter table EMPLOYEE
add index FK75C8D6AE13C12F64 (MNG_ID),
add constraint FK75C8D6AE13C12F64
foreign key (MNG_ID)
references EMPLOYEE (EMP_ID);
alter table TIMEKEEPER
add index FK744D9BFF6106A42 (EMP_ID),
add constraint FK744D9BFF6106A42
foreign key (EMP_ID)
references EMPLOYEE (EMP_ID);
向上面創(chuàng)建的表中,分別插入一些測試數(shù)據(jù),如下所示 -
insert into Department (DEPT_ID, DEPT_NAME, DEPT_NO, LOCATION)
values (10, 'ACCOUNTING', 'D10', 'NEW YORK');
insert into Department (DEPT_ID, DEPT_NAME, DEPT_NO, LOCATION)
values (20, 'RESEARCH', 'D20', 'DALLAS');
insert into Department (DEPT_ID, DEPT_NAME, DEPT_NO, LOCATION)
values (30, 'SALES', 'D30', 'CHICAGO');
insert into Department (DEPT_ID, DEPT_NAME, DEPT_NO, LOCATION)
values (40, 'OPERATIONS', 'D40', 'BOSTON');
-------------------------------------------------------------------------------------------------
insert into Employee (EMP_ID, EMP_NAME, EMP_NO, HIRE_DATE, JOB, SALARY, DEPT_ID, MNG_ID)
values (7839, 'KING', 'E7839', Str_To_Date('17-11-1981', '%d-%m-%Y'), 'PRESIDENT', 5000, 10, null);
insert into Employee (EMP_ID, EMP_NAME, EMP_NO, HIRE_DATE, JOB, SALARY, DEPT_ID, MNG_ID)
values (7566, 'JONES', 'E7566', Str_To_Date('02-04-1981', '%d-%m-%Y'), 'MANAGER', 2975, 20, 7839);
insert into Employee (EMP_ID, EMP_NAME, EMP_NO, HIRE_DATE, JOB, SALARY, DEPT_ID, MNG_ID)
values (7902, 'FORD', 'E7902', Str_To_Date('03-12-1981', '%d-%m-%Y'), 'ANALYST', 3000, 20, 7566);
insert into Employee (EMP_ID, EMP_NAME, EMP_NO, HIRE_DATE, JOB, SALARY, DEPT_ID, MNG_ID)
values (7369, 'SMITH', 'E7369', Str_To_Date('17-12-1980', '%d-%m-%Y'), 'CLERK', 800, 20, 7902);
insert into Employee (EMP_ID, EMP_NAME, EMP_NO, HIRE_DATE, JOB, SALARY, DEPT_ID, MNG_ID)
values (7698, 'BLAKE', 'E7698', Str_To_Date('01-05-1981', '%d-%m-%Y'), 'MANAGER', 2850, 30, 7839);
insert into Employee (EMP_ID, EMP_NAME, EMP_NO, HIRE_DATE, JOB, SALARY, DEPT_ID, MNG_ID)
values (7499, 'ALLEN', 'E7499', Str_To_Date('20-02-1981', '%d-%m-%Y'), 'SALESMAN', 1600, 30, 7698);
insert into Employee (EMP_ID, EMP_NAME, EMP_NO, HIRE_DATE, JOB, SALARY, DEPT_ID, MNG_ID)
values (7521, 'WARD', 'E7521', Str_To_Date('22-02-1981', '%d-%m-%Y'), 'SALESMAN', 1250, 30, 7698);
insert into Employee (EMP_ID, EMP_NAME, EMP_NO, HIRE_DATE, JOB, SALARY, DEPT_ID, MNG_ID)
values (7654, 'MARTIN', 'E7654', Str_To_Date('28-09-1981', '%d-%m-%Y'), 'SALESMAN', 1250, 30, 7698);
insert into Employee (EMP_ID, EMP_NAME, EMP_NO, HIRE_DATE, JOB, SALARY, DEPT_ID, MNG_ID)
values (7782, 'CLARK', 'E7782', Str_To_Date('09-06-1981', '%d-%m-%Y'), 'MANAGER', 2450, 30, 7839);
insert into Employee (EMP_ID, EMP_NAME, EMP_NO, HIRE_DATE, JOB, SALARY, DEPT_ID, MNG_ID)
values (7788, 'SCOTT', 'E7788', Str_To_Date('19-04-1987', '%d-%m-%Y'), 'ANALYST', 3000, 20, 7566);
insert into Employee (EMP_ID, EMP_NAME, EMP_NO, HIRE_DATE, JOB, SALARY, DEPT_ID, MNG_ID)
values (7844, 'TURNER', 'E7844', Str_To_Date('08-09-1981', '%d-%m-%Y'), 'SALESMAN', 1500, 30, 7698);
insert into Employee (EMP_ID, EMP_NAME, EMP_NO, HIRE_DATE, JOB, SALARY, DEPT_ID, MNG_ID)
values (7876, 'ADAMS', 'E7876', Str_To_Date('23-05-1987', '%d-%m-%Y'), 'CLERK', 1100, 20, 7698);
insert into Employee (EMP_ID, EMP_NAME, EMP_NO, HIRE_DATE, JOB, SALARY, DEPT_ID, MNG_ID)
values (7900, 'ADAMS', 'E7900', Str_To_Date('03-12-1981', '%d-%m-%Y'), 'CLERK', 950, 30, 7698);
insert into Employee (EMP_ID, EMP_NAME, EMP_NO, HIRE_DATE, JOB, SALARY, DEPT_ID, MNG_ID)
values (7934, 'MILLER', 'E7934', Str_To_Date('23-01-1982', '%d-%m-%Y'), 'CLERK', 1300, 10, 7698);
-------------------------------------------------------------------------------------------------
insert into Salary_Grade (GRADE, HIGH_SALARY, LOW_SALARY)
values (1, 9999, 3001);
在這里,創(chuàng)建一個Maven項目并在pom.xml
中聲明使用的Hibernate
庫。打開 Eclipse,選擇菜單 File -> New -> Other…,在彈出框中選擇 Maven,如下所示 -
下一步選擇工作目錄,如下圖所示 -
下一步,選擇模板類型,如下圖所示 -
下一步,寫入工程名稱:HibernateQuickStart,以及輸入包信息:com.yiibai
等信息。
項目(HibernateQuickStart)創(chuàng)建完成后,如下圖所示 -
在pom.xml
中,需要聲明使用Hibernate 5
庫,以及用于各種數(shù)據(jù)庫類型(如Oracle,MySQL和SQL Server)的JDBC庫,這里使用 MySQL JDBC。
完整的 pom.xml 配置/聲明如下所示 -
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.yiibai</groupId>
<artifactId>HibernateQuickStart</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>HibernateQuickStart</name>
<url>http://maven.apache.org</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
<!-- Hibernate Core -->
<!-- http://mvnrepository.com/artifact/org.hibernate/hibernate-core -->
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
<version>5.2.2.Final</version>
</dependency>
<!-- MySQL JDBC driver -->
<!-- http://mvnrepository.com/artifact/mysql/mysql-connector-java -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.34</version>
</dependency>
<!-- SQLServer JDBC driver (JTDS) -->
<!-- http://mvnrepository.com/artifact/net.sourceforge.jtds/jtds -->
<dependency>
<groupId>net.sourceforge.jtds</groupId>
<artifactId>jtds</artifactId>
<version>1.3.1</version>
</dependency>
</dependencies>
</project>
在這一步中,我們來創(chuàng)建實體類。每個實體描述一個數(shù)據(jù)庫中的表。這里先不說明每個類是做什么用的。一共要創(chuàng)建如下幾個實體類(對應(yīng)上面創(chuàng)建的四張表),如下 -
所有創(chuàng)建的類如下圖所示 -
這幾個類的代碼,分別如下所示 -
Department.java 類代碼 -
package com.yiibai.entities;
import java.util.HashSet;
import java.util.Set;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.Id;
import javax.persistence.OneToMany;
import javax.persistence.Table;
import javax.persistence.UniqueConstraint;
@Entity
@Table(name = "DEPARTMENT", uniqueConstraints = { @UniqueConstraint(columnNames = { "DEPT_NO" }) })
public class Department {
private Integer deptId;
private String deptNo;
private String deptName;
private String location;
private Set<Employee> employees = new HashSet<Employee>(0);
public Department() {
}
public Department(Integer deptId, String deptName, String location) {
this.deptId = deptId;
this.deptNo = "D" + this.deptId;
this.deptName = deptName;
this.location = location;
}
@Id
@Column(name = "DEPT_ID")
public Integer getDeptId() {
return deptId;
}
public void setDeptId(Integer deptId) {
this.deptId = deptId;
}
@Column(name = "DEPT_NO", length = 20, nullable = false)
public String getDeptNo() {
return deptNo;
}
public void setDeptNo(String deptNo) {
this.deptNo = deptNo;
}
@Column(name = "DEPT_NAME", nullable = false)
public String getDeptName() {
return deptName;
}
public void setDeptName(String deptName) {
this.deptName = deptName;
}
@Column(name = "LOCATION")
public String getLocation() {
return location;
}
public void setLocation(String location) {
this.location = location;
}
@OneToMany(fetch = FetchType.LAZY, mappedBy = "department")
public Set<Employee> getEmployees() {
return employees;
}
public void setEmployees(Set<Employee> employees) {
this.employees = employees;
}
}
Employee.java 類代碼 -
package com.yiibai.entities;
import java.util.Date;
import java.util.HashSet;
import java.util.Set;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.Lob;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
import javax.persistence.UniqueConstraint;
@Entity
@Table(name = "EMPLOYEE", uniqueConstraints = { @UniqueConstraint(columnNames = { "EMP_NO" }) })
public class Employee {
private Long empId;
private String empNo;
private String empName;
private String job;
private Employee manager;
private Date hideDate;
private Float salary;
private byte[] image;
private Department department;
private Set<Employee> employees = new HashSet<Employee>(0);
public Employee() {
}
public Employee(Long empId, String empName, String job, Employee manager, Date hideDate, Float salary, Float comm,
Department department) {
this.empId = empId;
this.empNo = "E" + this.empId;
this.empName = empName;
this.job = job;
this.manager = manager;
this.hideDate = hideDate;
this.salary = salary;
this.department = department;
}
@Id
@Column(name = "EMP_ID")
public Long getEmpId() {
return empId;
}
public void setEmpId(Long empId) {
this.empId = empId;
}
@Column(name = "EMP_NO", length = 20, nullable = false)
public String getEmpNo() {
return empNo;
}
public void setEmpNo(String empNo) {
this.empNo = empNo;
}
@Column(name = "EMP_NAME", length = 50, nullable = false)
public String getEmpName() {
return empName;
}
public void setEmpName(String empName) {
this.empName = empName;
}
@Column(name = "JOB", length = 30, nullable = false)
public String getJob() {
return job;
}
public void setJob(String job) {
this.job = job;
}
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "MNG_ID")
public Employee getManager() {
return manager;
}
public void setManager(Employee manager) {
this.manager = manager;
}
@Column(name = "HIRE_DATE", nullable = false)
@Temporal(TemporalType.DATE)
public Date getHideDate() {
return hideDate;
}
public void setHideDate(Date hideDate) {
this.hideDate = hideDate;
}
@Column(name = "SALARY", nullable = false)
public Float getSalary() {
return salary;
}
public void setSalary(Float salary) {
this.salary = salary;
}
@Column(name = "IMAGE", length = 1111111, nullable = true)
@Lob
public byte[] getImage() {
return image;
}
public void setImage(byte[] image) {
this.image = image;
}
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "DEPT_ID", nullable = false)
public Department getDepartment() {
return department;
}
public void setDepartment(Department department) {
this.department = department;
}
@OneToMany(fetch = FetchType.LAZY, mappedBy = "empId")
public Set<Employee> getEmployees() {
return employees;
}
public void setEmployees(Set<Employee> employees) {
this.employees = employees;
}
}
SalaryGrade.java 類代碼 -
package com.yiibai.entities;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;
@Entity
@Table(name = "SALARY_GRADE")
public class SalaryGrade {
private Integer grade;
private Float lowSalary;
private Float highSalary;
public SalaryGrade() {
}
public SalaryGrade(Integer grade, Float lowSalary, Float highSalary) {
this.grade = grade;
this.lowSalary = lowSalary;
this.highSalary = highSalary;
}
@Id
@Column(name = "GRADE")
public Integer getGrade() {
return grade;
}
public void setGrade(Integer grade) {
this.grade = grade;
}
@Column(name = "LOW_SALARY", nullable = false)
public Float getLowSalary() {
return lowSalary;
}
public void setLowSalary(Float lowSalary) {
this.lowSalary = lowSalary;
}
@Column(name = "HIGH_SALARY", nullable = false)
public Float getHighSalary() {
return highSalary;
}
public void setHighSalary(Float highSalary) {
this.highSalary = highSalary;
}
}
Timekeeper.java 類代碼 -
package com.yiibai.entities;
import java.util.Date;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
import org.hibernate.annotations.GenericGenerator;
@Entity
@Table(name = "TIMEKEEPER")
public class Timekeeper {
public static final char IN = 'I';
public static final char OUT = 'O';
private String timekeeperId;
private Date dateTime;
private Employee employee;
// 'I' or 'O'
private char inOut;
@Id
@GeneratedValue(generator = "uuid")
@GenericGenerator(name = "uuid", strategy = "uuid2")
@Column(name = "Timekeeper_Id", length = 36)
public String getTimekeeperId() {
return timekeeperId;
}
public void setTimekeeperId(String timekeeperId) {
this.timekeeperId = timekeeperId;
}
@Column(name = "Date_Time", nullable = false)
@Temporal(TemporalType.TIMESTAMP)
public Date getDateTime() {
return dateTime;
}
public void setDateTime(Date dateTime) {
this.dateTime = dateTime;
}
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "EMP_ID", nullable = false)
public Employee getEmployee() {
return employee;
}
public void setEmployee(Employee employee) {
this.employee = employee;
}
@Column(name = "In_Out", nullable = false, length = 1)
public char getInOut() {
return inOut;
}
public void setInOut(char inOut) {
this.inOut = inOut;
}
}
配置hibernate目的是讓Hibernate可以連接數(shù)據(jù)庫并與數(shù)據(jù)庫交互,并聲明在前面的步驟中創(chuàng)建的實體列表。
在src/main/java中創(chuàng)建一個名稱為:hibernate.cfg.xml 的配置文件,當前項目結(jié)構(gòu)如下圖所示 -
hibernate.cfg.xml 配置文件的內(nèi)容如下所示 -
<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<!-- Database connection settings -->
<property name="connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="connection.url">jdbc:mysql://localhost:3306/mydb?serverTimezone=UTC</property>
<property name="connection.username">root</property>
<property name="connection.password">123456</property>
<!-- JDBC connection pool (use the built-in) -->
<property name="connection.pool_size">1</property>
<!-- SQL dialect -->
<property name="dialect">org.hibernate.dialect.MySQLDialect</property>
<!-- Enable Hibernate's automatic session context management -->
<property name="current_session_context_class">thread</property>
<!-- Disable the second-level cache -->
<property name="cache.provider_class">org.hibernate.cache.internal.NoCacheProvider</property>
<!-- Echo all executed SQL to stdout -->
<property name="show_sql">true</property>
<mapping class="com.yiibai.entities.Department" />
<mapping class="com.yiibai.entities.Employee" />
<mapping class="com.yiibai.entities.SalaryGrade" />
<mapping class="com.yiibai.entities.Timekeeper" />
</session-factory>
</hibernate-configuration>
每種數(shù)據(jù)庫都有一個單獨的方言, 例如:
Oracle方言:
SQL Server方言:
MySQL方言
Dialect
是一個使用Hibernate的方式將數(shù)據(jù)庫的數(shù)據(jù)類型轉(zhuǎn)換為Java的數(shù)據(jù)類型,反之亦然。此外,它用于定義將HSQL(Hibernate SQL)的函數(shù)轉(zhuǎn)換為數(shù)據(jù)中的函數(shù)的方式,如下列出的一部分 -
Java SQL類型 | Oracle | MySQL | SQL Server |
---|---|---|---|
Types.BIT | number(1,0) | bit | bit |
Types.BIGINT | number(19,0) | bigin | bigint |
Types.DATE | date | date | date |
……. | … | … | … |
Types.CLOB | clob | longtext | varchar(MAX) |
Types.BLOB | blob | longblob | varbinary(MAX) |
創(chuàng)建一個文件: HibernateUtils.java , 其代碼如下 -
Hibernate使用Hibernate查詢語言(HQL)查詢數(shù)據(jù)。 HQL與我們所了解的數(shù)據(jù)庫SQL語句有點不同。
SQL:
HQL:
參考比較以下用法 -
-- SQL
-- This is a SQL query in table DEPARTMENT.
Select d.DEPT_NO, d.DEPT_NAME from DEPARTMENT d;
-- HQL
-- This is a HQL query in Entity Department.
Select d.deptNo, d.deptName from Department d;
-- Query Object
Select d from Department d;
Hibernate的操作規(guī)則:
應(yīng)用程序編寫的HQL在操作過程中,Hibernate本身就意識到它使用的數(shù)據(jù)庫類型(如:MySQL),它會自動將HQL轉(zhuǎn)換為等價的數(shù)據(jù)庫類型的SQL形式。 事實上,各種類型的數(shù)據(jù)庫之間的SQL語法有一些差異,比如:返回記錄的行數(shù)的限制就不同(MySQL中使用 limit
子句)。
可以參考HQL語法: http://docs.jboss.org/hibernate/orm/3.6/reference/en-US/html/queryhql.html
在Hibernate中有很多方法可以用來查詢數(shù)據(jù)。在這部分中,將介紹一些查詢數(shù)據(jù)的典型方法。
查詢對象示例-1
第一個例子,使用HQL查詢對象(Entity),創(chuàng)建一個Java類文件:QueryObjectDemo.java,其代碼如下 -
package com.yiibai;
import java.util.List;
import org.hibernate.query.Query;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import com.yiibai.HibernateUtils;
import com.yiibai.entities.Employee;
public class QueryObjectDemo {
public static void main(String[] args) {
SessionFactory factory = HibernateUtils.getSessionFactory();
Session session = factory.getCurrentSession();
try {
// All the action with DB via Hibernate
// must be located in one transaction.
// Start Transaction.
session.getTransaction().begin();
// Create an HQL statement, query the object.
// Equivalent to the SQL statement:
// Select e.* from EMPLOYEE e order by e.EMP_NAME, e.EMP_NO
String sql = "Select e from " + Employee.class.getName() + " e "
+ " order by e.empName, e.empNo ";
// Create Query object.
Query<Employee> query = session.createQuery(sql);
// Execute query.
List<Employee> employees = query.getResultList();
for (Employee emp : employees) {
System.out.println("Emp: " + emp.getEmpNo() + " : "
+ emp.getEmpName());
}
// Commit data.
session.getTransaction().commit();
} catch (Exception e) {
e.printStackTrace();
// Rollback in case of an error occurred.
session.getTransaction().rollback();
}
}
}
運行上面代碼,得到以下結(jié)果 -
查詢對象示例-2
創(chuàng)建一個Java類文件:QueryObjectDemo2.java,其代碼如下 -
package com.yiibai;
import java.util.List;
import org.hibernate.query.Query;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import com.yiibai.HibernateUtils;
import com.yiibai.entities.Employee;
public class QueryObjectDemo2 {
public static void main(String[] args) {
SessionFactory factory = HibernateUtils.getSessionFactory();
Session session = factory.getCurrentSession();
try {
// All the action with DB via Hibernate
// must be located in one transaction
// Start Transaction.
session.getTransaction().begin();
// Create an HQL statement, query the object.
// HQL with parameters.
// Equivalent to the SQL statement:
// Select e.* from EMPLOYEE e cross join DEPARTMENT d
// where e.DEPT_ID = d.DEPT_ID and d.DEPT_NO = :deptNo;
String sql = "Select e from " + Employee.class.getName() + " e " + " where e.department.deptNo=:deptNo ";
// Create query object.
Query<Employee> query = session.createQuery(sql);
query.setParameter("deptNo", "D10");
// Execute query.
List<Employee> employees = query.getResultList();
for (Employee emp : employees) {
System.out.println("Emp: " + emp.getEmpNo() + " : " + emp.getEmpName());
}
// Commit data
session.getTransaction().commit();
} catch (Exception e) {
e.printStackTrace();
// Rollback in case of an error occurred.
session.getTransaction().rollback();
}
}
}
運行上面代碼,得到以下結(jié)果 -
......
org.hibernate.hql.internal.QueryTranslatorFactoryInitiator initiateService
INFO: HHH000397: Using ASTQueryTranslatorFactory
Hibernate: select employee0_.EMP_ID ..._NO=?
Emp: E7839 : KING
Emp: E7934 : MILLER
`
創(chuàng)建一個Java類文件:QuerySomeColumnDemo.java,其代碼如下 -
package com.yiibai;
import java.util.List;
import org.hibernate.query.Query;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import com.yiibai.HibernateUtils;
import com.yiibai.entities.Employee;
public class QuerySomeColumnDemo {
public static void main(String[] args) {
SessionFactory factory = HibernateUtils.getSessionFactory();
Session session = factory.getCurrentSession();
try {
session.getTransaction().begin();
// Query some columns.
String sql = "Select e.empId, e.empNo, e.empName from "
+ Employee.class.getName() + " e ";
Query<Object[]> query = session.createQuery(sql);
// Execute Query.
// Get the array of Object
List<Object[]> datas = query.getResultList();
for (Object[] emp : datas) {
System.out.println("Emp Id: " + emp[0]);
System.out.println(" Emp No: " + emp[1]);
System.out.println(" Emp Name: " + emp[2]);
}
// Commit data.
session.getTransaction().commit();
} catch (Exception e) {
e.printStackTrace();
// Rollback in case of an error occurred.
session.getTransaction().rollback();
}
}
}
運行上面代碼,得到以下結(jié)果 -
Hibernate: select employee0_.EMP_ID..._0_ from EMPLOYEE employee0_
Emp Id: 7369
Emp No: E7369
Emp Name: SMITH
Emp Id: 7499
Emp No: E7499
Emp Name: ALLEN
Emp Id: 7521
Emp No: E7521
Emp Name: WARD
Emp Id: 7566
Emp No: E7566
Emp Name: JONES
Emp Id: 7654
Emp No: E7654
Emp Name: MARTIN
Emp Id: 7698
Emp No: E7698
Emp Name: BLAKE
Emp Id: 7782
Emp No: E7782
Emp Name: CLARK
Emp Id: 7788
Emp No: E7788
Emp Name: SCOTT
Emp Id: 7839
Emp No: E7839
Emp Name: KING
Emp Id: 7844
Emp No: E7844
Emp Name: TURNER
Emp Id: 7876
Emp No: E7876
Emp Name: ADAMS
Emp Id: 7900
Emp No: E7900
Emp Name: ADAMS
Emp Id: 7902
Emp No: E7902
Emp Name: FORD
Emp Id: 7934
Emp No: E7934
Emp Name: MILLER
`
在這種情況下,如果需要在某些表中提取某些列的數(shù)據(jù),最好的方法是使用Java bean。使用Java bean的構(gòu)造函數(shù)來為不同的字段設(shè)置值。在此構(gòu)造函數(shù)加入HQL查詢。
<