HQL - Hibernate查询语言 - 示例教程
HQL - Hibernate查询语言 - 示例教程
HQL或Hibernate查询语言是Hibernate Framework的面向对象查询语言。HQL与SQL非常相似,只是我们使用Objects而不是表名,这使得它更接近面向对象的编程。
目录[ 隐藏 ]
- 1 Hibernate查询语言 - HQL
- 1.1 HQL示例数据库设置
- 1.2 Hibernate Maven依赖项
- 1.3 Hibernate配置XML
- 1.4 Hibernate SessionFactory实用工具类
- 1.5具有基于注释的映射的模型类
- 1.6 HQL示例测试类
Hibernate查询语言 - HQL
HQL和大小写敏感性:除了java类和变量名之外,HQL不区分大小写。因此,SeLeCT
相同sELEct
的是一样的SELECT
,但com.journaldev.model.Employee
不一样的com.journaldev.model.EMPLOYEE
。
HQL中一些常用的支持条款是:
- HQL From:HQL From与SQL中的select子句相同,与之
from Employee
相同select * from Employee
。我们还可以创建别名,如from Employee emp
或from Employee as emp
。 - HQL Join:HQL支持内连接,左外连接,右外连接和完全连接。例如,
select e.name, a.city from Employee e INNER JOIN e.address a
。在此查询中,Employee类应具有名为address的变量。我们将在示例代码中查看它。 - 聚合函数:HQL支持常用的聚合函数,如count(*),count(distinct x),min(),max(),avg()和sum()。
- 表达式:HQL支持算术表达式(+, - ,*,/),二进制比较运算符(=,> =,<=,<>,!=,类似),逻辑运算(和,或,不)等。
- HQL还支持ordre by和group by子句。
- HQL也像SQL查询一样支持子查询。
- HQL也支持DDL,DML和执行存储过程。
让我们看一个在程序中使用HQL的简单示例。
HQL示例数据库设置
我使用MySQL数据库作为我的例子,下面的脚本将创建两个表Employee和Address。他们有一对一的映射,我为我的例子插入了一些演示数据。
CREATE TABLE `Employee` (`emp_id` int(11) unsigned NOT NULL AUTO_INCREMENT,`emp_name` varchar(20) NOT NULL,`emp_salary` double(10,0) NOT NULL DEFAULT '0',PRIMARY KEY (`emp_id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;CREATE TABLE `Address` (`emp_id` int(11) unsigned NOT NULL,`address_line1` varchar(50) NOT NULL DEFAULT '',`zipcode` varchar(10) DEFAULT NULL,`city` varchar(20) DEFAULT NULL,PRIMARY KEY (`emp_id`),CONSTRAINT `emp_fk_1` FOREIGN KEY (`emp_id`) REFERENCES `Employee` (`emp_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;INSERT INTO `Employee` (`emp_id`, `emp_name`, `emp_salary`)
VALUES(1, 'Pankaj', 100),(2, 'David', 200),(3, 'Lisa', 300),(4, 'Jack', 400);INSERT INTO `Address` (`emp_id`, `address_line1`, `zipcode`, `city`)
VALUES(1, 'Albany Dr', '95129', 'San Jose'),(2, 'Arques Ave', '95051', 'Santa Clara'),(3, 'BTM 1st Stage', '560100', 'Bangalore'),(4, 'City Centre', '100100', 'New Delhi');commit;
在Eclipse或您正在使用的IDE中创建maven项目,我们的最终项目将如下图所示。
Hibernate Maven依赖项
我们的最终pom.xml包含Hibernate和MySQL驱动程序的依赖项。
<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.journaldev.hibernate</groupId><artifactId>HQLExample</artifactId><version>0.0.1-SNAPSHOT</version><dependencies><dependency><groupId>org.hibernate</groupId><artifactId>hibernate-core</artifactId><version>4.3.5.Final</version></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>5.0.5</version></dependency></dependencies>
</project>
Hibernate配置XML
我们的hibernate配置xml文件包含与数据库连接相关的属性和映射类。我将使用注释进行Hibernate映射。
hibernate.cfg.xml代码:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC"-//Hibernate/Hibernate Configuration DTD 3.0//EN""http://hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration><session-factory><property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property><property name="hibernate.connection.password">pankaj123</property><property name="hibernate.connection.url">jdbc:mysql://localhost/TestDB</property><property name="hibernate.connection.username">pankaj</property><property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property><property name="hibernate.current_session_context_class">thread</property><property name="hibernate.show_sql">true</property><mapping class="com.journaldev.hibernate.model.Employee"/><mapping class="com.journaldev.hibernate.model.Address"/></session-factory>
</hibernate-configuration>
Hibernate SessionFactory实用工具类
我们有一个实用程序类来配置hibernate SessionFactory。
package com.journaldev.hibernate.util;import org.hibernate.SessionFactory;
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
import org.hibernate.cfg.Configuration;
import org.hibernate.service.ServiceRegistry;public class HibernateUtil {private static SessionFactory sessionFactory;private static SessionFactory buildSessionFactory() {try {// Create the SessionFactory from hibernate.cfg.xmlConfiguration configuration = new Configuration();configuration.configure("hibernate.cfg.xml");System.out.println("Hibernate Configuration loaded");ServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder().applySettings(configuration.getProperties()).build();System.out.println("Hibernate serviceRegistry created");SessionFactory sessionFactory = configuration.buildSessionFactory(serviceRegistry);return sessionFactory;}catch (Throwable ex) {System.err.println("Initial SessionFactory creation failed." + ex);ex.printStackTrace();throw new ExceptionInInitializerError(ex);}}public static SessionFactory getSessionFactory() {if(sessionFactory == null) sessionFactory = buildSessionFactory();return sessionFactory;}
}
具有基于注释的映射的模型类
我们带有JPA注释的模型类如下所示。
package com.journaldev.hibernate.model;import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.OneToOne;
import javax.persistence.Table;import org.hibernate.annotations.Cascade;@Entity
@Table(name = "EMPLOYEE")
public class Employee {@Id@GeneratedValue(strategy = GenerationType.IDENTITY)@Column(name = "emp_id")private long id;@Column(name = "emp_name")private String name;@Column(name = "emp_salary")private double salary;@OneToOne(mappedBy = "employee")@Cascade(value = org.hibernate.annotations.CascadeType.ALL)private Address address;public long getId() {return id;}public void setId(long id) {this.id = id;}public Address getAddress() {return address;}public void setAddress(Address address) {this.address = address;}public String getName() {return name;}public void setName(String name) {this.name = name;}public double getSalary() {return salary;}public void setSalary(double salary) {this.salary = salary;}}
package com.journaldev.hibernate.model;import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.OneToOne;
import javax.persistence.PrimaryKeyJoinColumn;
import javax.persistence.Table;import org.hibernate.annotations.GenericGenerator;
import org.hibernate.annotations.Parameter;@Entity
@Table(name = "ADDRESS")
public class Address {@Id@Column(name = "emp_id", unique = true, nullable = false)@GeneratedValue(generator = "gen")@GenericGenerator(name = "gen", strategy = "foreign", parameters = { @Parameter(name = "property", value = "employee") })private long id;@Column(name = "address_line1")private String addressLine1;@Column(name = "zipcode")private String zipcode;@Column(name = "city")private String city;@OneToOne@PrimaryKeyJoinColumnprivate Employee employee;public long getId() {return id;}public void setId(long id) {this.id = id;}public String getAddressLine1() {return addressLine1;}public void setAddressLine1(String addressLine1) {this.addressLine1 = addressLine1;}public String getZipcode() {return zipcode;}public void setZipcode(String zipcode) {this.zipcode = zipcode;}public String getCity() {return city;}public void setCity(String city) {this.city = city;}public Employee getEmployee() {return employee;}public void setEmployee(Employee employee) {this.employee = employee;}}
HQL示例测试类
让我们看看如何在java程序中使用HQL。
package com.journaldev.hibernate.main;import java.util.Arrays;
import java.util.List;import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;import com.journaldev.hibernate.model.Employee;
import com.journaldev.hibernate.util.HibernateUtil;public class HQLExamples {@SuppressWarnings("unchecked")public static void main(String[] args) {//Prep workSessionFactory sessionFactory = HibernateUtil.getSessionFactory();Session session = sessionFactory.getCurrentSession();//HQL example - Get All EmployeesTransaction tx = session.beginTransaction();Query query = session.createQuery("from Employee");List<Employee> empList = query.list();for(Employee emp : empList){System.out.println("List of Employees::"+emp.getId()+","+emp.getAddress().getCity());}//HQL example - Get Employee with idquery = session.createQuery("from Employee where id= :id");query.setLong("id", 3);Employee emp = (Employee) query.uniqueResult();System.out.println("Employee Name="+emp.getName()+", City="+emp.getAddress().getCity());//HQL pagination examplequery = session.createQuery("from Employee");query.setFirstResult(0); //starts with 0query.setFetchSize(2);empList = query.list();for(Employee emp4 : empList){System.out.println("Paginated Employees::"+emp4.getId()+","+emp4.getAddress().getCity());}//HQL Update Employeequery = session.createQuery("update Employee set name= :name where id= :id");query.setParameter("name", "Pankaj Kumar");query.setLong("id", 1);int result = query.executeUpdate();System.out.println("Employee Update Status="+result);//HQL Delete Employee, we need to take care of foreign key constraints tooquery = session.createQuery("delete from Address where id= :id");query.setLong("id", 4);result = query.executeUpdate();System.out.println("Address Delete Status="+result);query = session.createQuery("delete from Employee where id= :id");query.setLong("id", 4);result = query.executeUpdate();System.out.println("Employee Delete Status="+result);//HQL Aggregate function examplesquery = session.createQuery("select sum(salary) from Employee");double sumSalary = (Double) query.uniqueResult();System.out.println("Sum of all Salaries= "+sumSalary);//HQL join examplesquery = session.createQuery("select e.name, a.city from Employee e "+ "INNER JOIN e.address a");List<Object[]> list = query.list();for(Object[] arr : list){System.out.println(Arrays.toString(arr));}//HQL group by and like examplequery = session.createQuery("select e.name, sum(e.salary), count(e)"+ " from Employee e where e.name like '%i%' group by e.name");List<Object[]> groupList = query.list();for(Object[] arr : groupList){System.out.println(Arrays.toString(arr));}//HQL order by examplequery = session.createQuery("from Employee e order by e.id desc");empList = query.list();for(Employee emp3 : empList){System.out.println("ID Desc Order Employee::"+emp3.getId()+","+emp3.getAddress().getCity());}//rolling back to save the test datatx.rollback();//closing hibernate resourcessessionFactory.close();}}
请注意,我使用HQL进行选择,更新和删除操作。它还说明了如何使用HQL Join和HQL Aggregate函数。
当我运行上面的hql示例程序时,我们得到以下输出。
May 22, 2014 1:55:37 PM org.hibernate.annotations.common.reflection.java.JavaReflectionManager <clinit>
INFO: HCANN000001: Hibernate Commons Annotations {4.0.4.Final}
May 22, 2014 1:55:37 PM org.hibernate.Version logVersion
INFO: HHH000412: Hibernate Core {4.3.5.Final}
May 22, 2014 1:55:37 PM org.hibernate.cfg.Environment <clinit>
INFO: HHH000206: hibernate.properties not found
May 22, 2014 1:55:37 PM org.hibernate.cfg.Environment buildBytecodeProvider
INFO: HHH000021: Bytecode provider name : javassist
May 22, 2014 1:55:37 PM org.hibernate.cfg.Configuration configure
INFO: HHH000043: Configuring from resource: hibernate.cfg.xml
May 22, 2014 1:55:37 PM org.hibernate.cfg.Configuration getConfigurationInputStream
INFO: HHH000040: Configuration resource: hibernate.cfg.xml
May 22, 2014 1:55:37 PM org.hibernate.cfg.Configuration doConfigure
INFO: HHH000041: Configured SessionFactory: null
Hibernate Configuration loaded
Hibernate serviceRegistry created
May 22, 2014 1:55:37 PM org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl configure
WARN: HHH000402: Using Hibernate built-in connection pool (not for production use!)
May 22, 2014 1:55:37 PM org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl buildCreator
INFO: HHH000401: using driver [com.mysql.jdbc.Driver] at URL [jdbc:mysql://localhost/TestDB]
May 22, 2014 1:55:37 PM org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl buildCreator
INFO: HHH000046: Connection properties: {user=pankaj, password=****}
May 22, 2014 1:55:37 PM org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl buildCreator
INFO: HHH000006: Autocommit mode: false
May 22, 2014 1:55:37 PM org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl configure
INFO: HHH000115: Hibernate connection pool size: 20 (min=1)
May 22, 2014 1:55:37 PM org.hibernate.dialect.Dialect <init>
INFO: HHH000400: Using dialect: org.hibernate.dialect.MySQLDialect
May 22, 2014 1:55:37 PM org.hibernate.engine.jdbc.internal.LobCreatorBuilder useContextualLobCreation
INFO: HHH000423: Disabling contextual LOB creation as JDBC driver reported JDBC version [3] less than 4
May 22, 2014 1:55:38 PM org.hibernate.engine.transaction.internal.TransactionFactoryInitiator initiateService
INFO: HHH000399: Using default transaction strategy (direct JDBC transactions)
May 22, 2014 1:55:38 PM org.hibernate.hql.internal.ast.ASTQueryTranslatorFactory <init>
INFO: HHH000397: Using ASTQueryTranslatorFactory
Hibernate: select employee0_.emp_id as emp_id1_1_, employee0_.emp_name as emp_name2_1_, employee0_.emp_salary as emp_sala3_1_ from EMPLOYEE employee0_
Hibernate: select address0_.emp_id as emp_id1_0_0_, address0_.address_line1 as address_2_0_0_, address0_.city as city3_0_0_, address0_.zipcode as zipcode4_0_0_, employee1_.emp_id as emp_id1_1_1_, employee1_.emp_name as emp_name2_1_1_, employee1_.emp_salary as emp_sala3_1_1_ from ADDRESS address0_ left outer join EMPLOYEE employee1_ on address0_.emp_id=employee1_.emp_id where address0_.emp_id=?
Hibernate: select address0_.emp_id as emp_id1_0_0_, address0_.address_line1 as address_2_0_0_, address0_.city as city3_0_0_, address0_.zipcode as zipcode4_0_0_, employee1_.emp_id as emp_id1_1_1_, employee1_.emp_name as emp_name2_1_1_, employee1_.emp_salary as emp_sala3_1_1_ from ADDRESS address0_ left outer join EMPLOYEE employee1_ on address0_.emp_id=employee1_.emp_id where address0_.emp_id=?
Hibernate: select address0_.emp_id as emp_id1_0_0_, address0_.address_line1 as address_2_0_0_, address0_.city as city3_0_0_, address0_.zipcode as zipcode4_0_0_, employee1_.emp_id as emp_id1_1_1_, employee1_.emp_name as emp_name2_1_1_, employee1_.emp_salary as emp_sala3_1_1_ from ADDRESS address0_ left outer join EMPLOYEE employee1_ on address0_.emp_id=employee1_.emp_id where address0_.emp_id=?
Hibernate: select address0_.emp_id as emp_id1_0_0_, address0_.address_line1 as address_2_0_0_, address0_.city as city3_0_0_, address0_.zipcode as zipcode4_0_0_, employee1_.emp_id as emp_id1_1_1_, employee1_.emp_name as emp_name2_1_1_, employee1_.emp_salary as emp_sala3_1_1_ from ADDRESS address0_ left outer join EMPLOYEE employee1_ on address0_.emp_id=employee1_.emp_id where address0_.emp_id=?
List of Employees::1,San Jose
List of Employees::2,Santa Clara
List of Employees::3,Bangalore
List of Employees::4,New Delhi
Hibernate: select employee0_.emp_id as emp_id1_1_, employee0_.emp_name as emp_name2_1_, employee0_.emp_salary as emp_sala3_1_ from EMPLOYEE employee0_ where employee0_.emp_id=?
Employee Name=Lisa, City=Bangalore
Hibernate: select employee0_.emp_id as emp_id1_1_, employee0_.emp_name as emp_name2_1_, employee0_.emp_salary as emp_sala3_1_ from EMPLOYEE employee0_
Paginated Employees::1,San Jose
Paginated Employees::2,Santa Clara
Paginated Employees::3,Bangalore
Paginated Employees::4,New Delhi
Hibernate: update EMPLOYEE set emp_name=? where emp_id=?
Employee Update Status=1
Hibernate: delete from ADDRESS where emp_id=?
Address Delete Status=1
Hibernate: delete from EMPLOYEE where emp_id=?
Employee Delete Status=1
Hibernate: select sum(employee0_.emp_salary) as col_0_0_ from EMPLOYEE employee0_
Sum of all Salaries= 600.0
Hibernate: select employee0_.emp_name as col_0_0_, address1_.city as col_1_0_ from EMPLOYEE employee0_ inner join ADDRESS address1_ on employee0_.emp_id=address1_.emp_id
[Pankaj Kumar, San Jose]
[David, Santa Clara]
[Lisa, Bangalore]
Hibernate: select employee0_.emp_name as col_0_0_, sum(employee0_.emp_salary) as col_1_0_, count(employee0_.emp_id) as col_2_0_ from EMPLOYEE employee0_ where employee0_.emp_name like '%i%' group by employee0_.emp_name
[David, 200.0, 1]
[Lisa, 300.0, 1]
Hibernate: select employee0_.emp_id as emp_id1_1_, employee0_.emp_name as emp_name2_1_, employee0_.emp_salary as emp_sala3_1_ from EMPLOYEE employee0_ order by employee0_.emp_id desc
ID Desc Order Employee::3,Bangalore
ID Desc Order Employee::2,Santa Clara
ID Desc Order Employee::1,San Jose
May 22, 2014 1:55:38 PM org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl stop
INFO: HHH000030: Cleaning up connection pool [jdbc:mysql://localhost/TestDB]
请注意,一旦执行删除操作,进一步的操作不会显示记录数据(工资总和为600)。但是我正在回滚事务,因此表中的数据将保持不变。更改代码以提交事务,它将反映在数据库表中。
我不喜欢使用HQL查询,因为您可以看到我们需要在代码中处理表映射。如果我们将使用Session删除Employee对象,它将从两个表中删除记录。
您可以从下面的链接下载示例hql示例项目并尝试更多示例。
下载Hibernate HQL项目
转载来源:https://www.journaldev.com/2954/hibernate-query-language-hql-example-tutorial
HQL - Hibernate查询语言 - 示例教程相关推荐
- HQL –Hibernate查询语言–示例教程
HQL or Hibernate Query Language is the object-oriented query language of Hibernate Framework. HQL is ...
- Hibernate Criteria示例教程
Hibernate Criteria示例教程 欢迎使用Hibernate Criteria示例教程.今天我们将研究Hibernate中的Criteria. Hibernate Criteria 大多数 ...
- Spring Hibernate集成示例教程
Spring Hibernate集成示例教程(Spring 4 + Hibernate 3和Hibernate 4) Spring是最常用的Java EE Framework之一,而Hibernate ...
- Struts2 Hibernate集成示例教程
Struts2 Hibernate集成示例教程 Struts2和Hibernate都是各自领域中广泛使用的框架.今天我们将学习如何将Struts2 Web应用程序框架与Hibernate ORM框架集 ...
- JSF Spring Hibernate集成示例教程
JSF Spring Hibernate集成示例教程 欢迎使用JSF Spring Hibernate Integration示例教程.在上一篇教程中,我们了解了如何将JSF和Spring框架集成在一 ...
- Primefaces Spring和Hibernate集成示例教程
Primefaces Spring和Hibernate集成示例教程 欢迎使用Spring Primefaces和Hibernate Integration示例.框架之间的集成是一项复杂的任务,而且大多 ...
- jsf集成spring_JSF Spring Hibernate集成示例教程
jsf集成spring Welcome to JSF Spring Hibernate Integration example tutorial. In our last tutorial, we s ...
- primefaces教程_Primefaces Spring和Hibernate集成示例教程
primefaces教程 Welcome to the Spring Primefaces and Hibernate Integration example. Integration between ...
- hibernate示例_Hibernate条件示例教程
hibernate示例 Welcome to the Hibernate Criteria Example Tutorial. Today we will look into Criteria in ...
最新文章
- java 学习 --------接口概念
- Vue中使用speak-tts插件实现点击按钮后进行语音播报(TTS/文字转语音)
- Bokeh——交互式可视化库
- C++primer 第 3 章 字符串、向量和数组 3 . 4 迭代器介绍
- 少一些计较多_做人,少一点套路,多一些真诚,少一点计较,多一些宽容
- 五种I/O模型和Java NIO源码分析
- macOS 安装 Win11 常见问题及解决方案
- 人民银行支付系统(CNAPS)和中国银联下面的跨行支付系统是一回事儿吗
- 小米笔记本Pro14 黑苹果失败<经验>
- 机械硬盘显示无法访问由于IO设备错误的资料找回方法
- 【Proteus仿真】单端稳压和双极性对称稳压电源电路(LM7812、LM7912)
- C语言函数:even(n),fflush(stdin)
- 《Photoshop修饰与合成专业技法》目录—导读
- usb触摸屏驱动移植
- 【移动端二】夜神模拟器
- Coursera--DataStructure-加州理工大学圣地亚哥分校课程
- Qt 3D Overview
- golang获取时间所在周的起止时间
- Ubuntu 21.04(arm64) 基于sanp安装Nextcloud,挂载本地硬盘
- 【自动化测试】Pytest+Appium+Allure 做 UI 自动化的那些事
热门文章
- HTML5+CSS3实现的响应式垂直时间轴
- UITableView 系列二 :资料的设定方式 (Navigation Controller切换视图) (实例)
- PHP HTML 生成 PDF
- KMP——怪盗基德的挑战书(hdu4552)
- Qt Ctreator搭配VS2013调试——整合QML/C++调试需要的从属调试引擎无法被创建
- Kubernetes-NodePort(十七)
- 使用属性升级MyBank >> 掌握自定义方法的定义及调用 1214
- 导航器 Navigator
- 综合演练 对象数组 对象的方法 我们9203班 0912
- python3.8安装教程 20200701