Hibernate的HQL简介详解编程语言

HQL(Hibernate Query Language)描写对象操作一种查询语言。Hibernate特有。
与SQL语法基本一致,不同的是HQL是面象对象的查询,查询的是对象和对象中的属性
HQL的关键字不区分大小写,但类名和属性名区分大小写

在Hibernate 提供的各种检索方式中, HQL是使用最广的一种检索方式. 它有如下功能:
在查询语句中设定各种查询条件
支持投影查询, 即仅检索出对象的部分属性
支持分页查询
支持连接查询
支持分组查询, 允许使用 HAVING 和 GROUP BY 关键字
提供内置聚集函数, 如 sum(), min() 和 max()
能够调用 用户定义的 SQL 函数或标准的 SQL 函数
支持子查询
支持动态绑定参数

测试类:

package com.my.bean; 
import java.util.List; 
import org.hibernate.Query; 
import org.hibernate.Session; 
import org.hibernate.Transaction; 
import org.junit.Test; 
import cn.itcast.util.SessionUtils; 
public class TestHQL { 
@Test 
public void demo01(){ 
// 查询所有 HQL 
Session session = SessionUtils.openSession(); 
Transaction transaction = session.beginTransaction(); 
Query query = session.createQuery("from Customer"); 
List<Customer> allCustomer = query.list();  
for (Customer customer : allCustomer) { 
System.out.println(customer.getName()); 
} 
transaction.commit(); 
session.close(); 
} 
@Test 
public void demo02(){ 
// 查询 带有条件的,可以使用别名 AS 
Session session = SessionUtils.openSession(); 
Transaction transaction = session.beginTransaction(); 
Query query = session.createQuery("FROM Customer AS c WHERE c.id = 5");   
Customer customer =  (Customer) query.uniqueResult(); 
System.out.println(customer.getName()); 
transaction.commit(); 
session.close(); 
} 
@Test 
public void demo03(){ 
// 排序 order by , asc 升序 | desc 降序 
Session session = SessionUtils.openSession(); 
Transaction transaction = session.beginTransaction(); 
Query query = session.createQuery("from Customer c order by c.id desc"); 
List<Customer> all = query.list(); 
for (Customer customer : all) { 
System.out.println(customer); 
} 
transaction.commit(); 
session.close(); 
} 
@Test 
public void demo04(){ 
// 查询部分内容 
Session session = SessionUtils.openSession(); 
Transaction transaction = session.beginTransaction(); 
//将部分数据,封装到Customer 对象中 
Query query = session.createQuery("select new Customer(c.name) from Customer c");  //必须提供相应的构造方式 
List all = query.list(); 
System.out.println(all); 
transaction.commit(); 
session.close(); 
} 
@Test 
public void demo05(){ 
// 分页,查询订单 
Session session = SessionUtils.openSession(); 
Transaction transaction = session.beginTransaction(); 
Query query = session.createQuery("from Order"); 
// 添加分页条件 
// 第一页 
query.setFirstResult(0); 
query.setMaxResults(7); 
List<Order> all = query.list(); 
for (Order order : all) { 
System.out.println(order); 
} 
transaction.commit(); 
session.close(); 
} 
@Test 
public void demo06(){ 
// 参数 
Session session = SessionUtils.openSession(); 
Transaction transaction = session.beginTransaction(); 
//使用? 
Query query = session.createQuery("from Customer c where c.id = ? "); 
// 需要绑定参数,将实际参数替换? 
query.setParameter(0, 5); 
List<Customer> all = query.list(); 
for (Customer customer : all) { 
System.out.println(customer); 
} 
//* 使用hibernate提供的别名 
Query query1 = session.createQuery("from Customer c where c.id = :id "); 
query1.setInteger("id", 5); //第一个参数就是hql中定义名称   :名称 
List<Customer> all = query1.list(); 
for (Customer customer : all) { 
System.out.println(customer); 
} 
transaction.commit(); 
session.close(); 
} 
@Test 
public void demo07(){ 
// 聚合函数 
Session session = SessionUtils.openSession(); 
Transaction transaction = session.beginTransaction(); 
// 使用hibernate提供的别名 
Query query = session.createQuery("select count(*) from Customer"); 
Object obj = query.uniqueResult(); 
Long totalPage = (Long) obj; 
transaction.commit(); 
session.close(); 
} 
@Test 
public void demo08(){ 
// 左外连接 -- left outer join 
Session session = SessionUtils.openSession(); 
Transaction transaction = session.beginTransaction(); 
//* 使用hibernate提供的别名 
Query query = session.createQuery("from Customer c left outer join c.orderSet"); 
// List 保存数据为 List ,数组中每一个元素又一个对象数组Object[],存放的是Customer,存放是Order 
List<Object[]> all = query.list(); 
for (Object[] objArr : all) { 
System.out.println(objArr); 
//objArr[0] --> Customer 
//objArr[1] --> Order 
} 
transaction.commit(); 
session.close(); 
} 
@Test 
public void demo09(){ 
// 迫切左外连接 -- left outer join fetch  , 将数据封装到对象 
Session session = SessionUtils.openSession(); 
Transaction transaction = session.beginTransaction(); 
//* 使用hibernate提供的别名  , 使用 distinct进行去重 
Query query = session.createQuery("select distinct c from Customer c left outer join fetch c.orderSet"); 
List<Customer> all = query.list(); 
for (Customer customer : all) { 
System.out.println(customer); 
} 
transaction.commit(); 
session.close(); 
} 
@Test 
public void demo10(){ 
// 命名查询 
Session session = SessionUtils.openSession(); 
Transaction transaction = session.beginTransaction(); 
Query query = session.getNamedQuery("findAllCustomer"); //获得配置文件中的名称 
System.out.println(query.list().size()); 
transaction.commit(); 
session.close(); 
} 
} 

命名查询的hbm文件配置:

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE hibernate-mapping PUBLIC  
"-//Hibernate/Hibernate Mapping DTD 3.0//EN" 
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> 
<hibernate-mapping package="com.my.bean"> 
<class name="Customer" table="t_customer"> 
<id name="id"> 
<generator class="native"></generator> 
</id> 
<property name="name"></property> 
<set name="orderSet" cascade="save-update"> 
<key column="customer_id"/> 
<one-to-many class="Order"/> 
</set> 
</class> 
<!-- 定义全局的HQL语句 --> 
<query name="findAllCustomer"> 
<![CDATA[from Customer]]>  
</query> 
</hibernate-mapping>

原创文章,作者:Maggie-Hunter,如若转载,请注明出处:https://blog.ytso.com/tech/pnotes/12082.html

(0)
上一篇 2021年7月19日 14:18
下一篇 2021年7月19日 14:18

相关推荐

发表回复

登录后才能评论