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中一些常用的支持条款是:

  1. HQL From:HQL From与SQL中的select子句相同,与之from Employee相同select * from Employee。我们还可以创建别名,如from Employee empfrom Employee as emp
  2. HQL Join:HQL支持内连接,左外连接,右外连接和完全连接。例如,select e.name, a.city from Employee e INNER JOIN e.address a。在此查询中,Employee类应具有名为address的变量。我们将在示例代码中查看它。
  3. 聚合函数:HQL支持常用的聚合函数,如count(*),count(distinct x),min(),max(),avg()和sum()。
  4. 表达式:HQL支持算术表达式(+, - ,*,/),二进制比较运算符(=,> =,<=,<>,!=,类似),逻辑运算(和,或,不)等。
  5. HQL还支持ordre by和group by子句。
  6. HQL也像SQL查询一样支持子查询。
  7. 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查询语言 - 示例教程相关推荐

  1. HQL –Hibernate查询语言–示例教程

    HQL or Hibernate Query Language is the object-oriented query language of Hibernate Framework. HQL is ...

  2. Hibernate Criteria示例教程

    Hibernate Criteria示例教程 欢迎使用Hibernate Criteria示例教程.今天我们将研究Hibernate中的Criteria. Hibernate Criteria 大多数 ...

  3. Spring Hibernate集成示例教程

    Spring Hibernate集成示例教程(Spring 4 + Hibernate 3和Hibernate 4) Spring是最常用的Java EE Framework之一,而Hibernate ...

  4. Struts2 Hibernate集成示例教程

    Struts2 Hibernate集成示例教程 Struts2和Hibernate都是各自领域中广泛使用的框架.今天我们将学习如何将Struts2 Web应用程序框架与Hibernate ORM框架集 ...

  5. JSF Spring Hibernate集成示例教程

    JSF Spring Hibernate集成示例教程 欢迎使用JSF Spring Hibernate Integration示例教程.在上一篇教程中,我们了解了如何将JSF和Spring框架集成在一 ...

  6. Primefaces Spring和Hibernate集成示例教程

    Primefaces Spring和Hibernate集成示例教程 欢迎使用Spring Primefaces和Hibernate Integration示例.框架之间的集成是一项复杂的任务,而且大多 ...

  7. jsf集成spring_JSF Spring Hibernate集成示例教程

    jsf集成spring Welcome to JSF Spring Hibernate Integration example tutorial. In our last tutorial, we s ...

  8. primefaces教程_Primefaces Spring和Hibernate集成示例教程

    primefaces教程 Welcome to the Spring Primefaces and Hibernate Integration example. Integration between ...

  9. hibernate示例_Hibernate条件示例教程

    hibernate示例 Welcome to the Hibernate Criteria Example Tutorial. Today we will look into Criteria in ...

最新文章

  1. java 学习 --------接口概念
  2. Vue中使用speak-tts插件实现点击按钮后进行语音播报(TTS/文字转语音)
  3. Bokeh——交互式可视化库
  4. C++primer 第 3 章 字符串、向量和数组 3 . 4 迭代器介绍
  5. 少一些计较多_做人,少一点套路,多一些真诚,少一点计较,多一些宽容
  6. 五种I/O模型和Java NIO源码分析
  7. macOS 安装 Win11 常见问题及解决方案
  8. 人民银行支付系统(CNAPS)和中国银联下面的跨行支付系统是一回事儿吗
  9. 小米笔记本Pro14 黑苹果失败<经验>
  10. 机械硬盘显示无法访问由于IO设备错误的资料找回方法
  11. 【Proteus仿真】单端稳压和双极性对称稳压电源电路(LM7812、LM7912)
  12. C语言函数:even(n),fflush(stdin)
  13. 《Photoshop修饰与合成专业技法》目录—导读
  14. usb触摸屏驱动移植
  15. 【移动端二】夜神模拟器
  16. Coursera--DataStructure-加州理工大学圣地亚哥分校课程
  17. Qt 3D Overview
  18. golang获取时间所在周的起止时间
  19. Ubuntu 21.04(arm64) 基于sanp安装Nextcloud,挂载本地硬盘
  20. 【自动化测试】Pytest+Appium+Allure 做 UI 自动化的那些事

热门文章

  1. HTML5+CSS3实现的响应式垂直时间轴
  2. UITableView 系列二 :资料的设定方式 (Navigation Controller切换视图) (实例)
  3. PHP HTML 生成 PDF
  4. KMP——怪盗基德的挑战书(hdu4552)
  5. Qt Ctreator搭配VS2013调试——整合QML/C++调试需要的从属调试引擎无法被创建
  6. Kubernetes-NodePort(十七)
  7. 使用属性升级MyBank >> 掌握自定义方法的定义及调用 1214
  8. 导航器 Navigator
  9. 综合演练 对象数组 对象的方法 我们9203班 0912
  10. python3.8安装教程 20200701