- 【Java中级】11.0 SSH之Hibernate框架(八)—
- 【Java中级】10.0 SSH之Hibernate框架(七)—
- 【Java中级】6.0 SSH之Hibernate框架(二)——
- 【Java中级】8.5 SSH之Hibernate框架(五)——
- 【Java中级】9.0 SSH之Hibernate框架(六)——
- 【Java中级】8.0 SSH之Hibernate框架(四)——
- 【Java中级】12.0 SSH之Hibernate框架(九)—
- 【Java中级】13.0 SSH之Hibernate框架(十)—
- 【Java中级】5.0 SSH之Hibernate框架(一)——
- 【Java中级】7.0 SSH之Hibernate框架(三)——
本篇内容源代码:
Github —— HibernateQueryDemo
在Hibernate中提供了很多种的查询的方式。Hibernate共提供了五种查询方式。
OID查询
对象导航检索
HQL检索(主要使用)
QBC检索(主要使用)
SQL检索
QBC检索参考如下文章:
【Java中级】8.0 SSH之Hibernate框架(四)——持久化类的编写规则、一级缓存、事务管理及其他API
【Java中级】8.5 SSH之Hibernate框架(五)——关于Criteria(QBC)过时的补充
以下代码测试,全部采用Hibernate一对多关系模式。
1.0 Hibernate的查询方式:OID查询
OID检索:Hibernate根据对象的OID(主键)进行检索
1.1 使用get方法
Customer customer = session.get(Customer.class,1l);
1.2 使用load方法
Customer customer = session.load(Customer.class,1l);
2.0 Hibernate的查询方式:对象导航检索
对象导航检索: Hibernate根据一个已经查询到的对象,获得其关联的对象的一种查询方式。
LinkMan linkMan = session.get(LinkMan.class,1l);
Customer customer = linkMan.getCustomer();
Customer customer = session.get(Customer.class,2l);
Set<LinkMan> linkMans = customer.getLinkMans();
通过一个已知对象获得一个关联对象。
3.0 Hibernate的查询方式:HQL检索(主要使用)
HQL查询:Hibernate Query Language,Hibernate的查询语言,是一种面向对象的方式的查询语言,语法类似SQL。通过session.createQuery(),用于接收一个HQL进行查询方式。
3.1 初始化一些数据
创建新的数据库,在eclipse中搭建Hibernate项目环境。
![](https://img.haomeiwen.com/i16102290/15c5d33b4a202e59.png)
代码放最后,或者在我的GitHub下载。
链接暂空。
先利用HibernateDemo1.java中新建方法初始化数据库数据。
package com.edp.hibernate.demo1;
/**
*
* @Title: HibernateDemo1.java
* @Package com.edp.hibernate.demo1
* @author EdPeng
* @version 创建时间 2020年2月7日下午9:01:14
* @Description HQL查询方式的测试类
* @version V1.0
*/
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.junit.Test;
import com.edp.hibernate.domain.Customer;
import com.edp.hibernate.domain.LinkMan;
import com.edp.hibernate.utils.HibernateUtils;
public class HibernateDemo1 {
@Test
public void demo1() {
Session session = HibernateUtils.getCurrentSession();
Transaction transaction = session.beginTransaction();
// 创建一个客户
Customer customer = new Customer();
customer.setCust_name("王三");
for (int i = 0; i <= 10; i++) {
LinkMan linkMan = new LinkMan();
linkMan.setLkm_name("五菱之光" + i);
linkMan.setCustomer(customer);
customer.getLinkMans().add(linkMan);
session.save(linkMan);
}
session.save(customer);
transaction.commit();
}
}
修改不同的名称,再运行两次,最后数据库初始化如下:
![](https://img.haomeiwen.com/i16102290/6419e1d845506e7a.png)
![](https://img.haomeiwen.com/i16102290/991b879a2d26ec93.png)
3.2 HQL的简单查询
在HibernateDemo1.java中新建方法:
@Test
/**
*
* @Title: demo2
* @Description: HQL的简单查询
* @param
* @return void
* @throws
*
*/
public void demo2() {
Session session = HibernateUtils.getCurrentSession();
Transaction transaction = session.beginTransaction();
Query query = session.createQuery("from Customer");
// sql中支持*号的写法:select * from cst_customer;但是在HQL中不支持*号的写法
// Query query = session.createQuery("select * from Customer");该写法错误
List<Customer> list = query.list();
for (Customer customer : list) {
System.out.println(customer);
}
transaction.commit();
}
![](https://img.haomeiwen.com/i16102290/bcb645a750d39c4c.png)
3.3 HQL的别名查询
在HibernateDemo1.java中新建方法:
@Test
/**
*
* @Title: demo3
* @Description: HQL的别名查询
* @param
* @return void
* @throws
*
*/
public void demo3() {
Session session = HibernateUtils.getCurrentSession();
Transaction transaction = session.beginTransaction();
// 取别名叫bieMing
// Query query = session.createQuery("from Customer bieMing");
Query query =session.createQuery("select bieMing from Customer bieMing");
List<Customer> list = query.list();
for (Customer customer : list) {
System.out.println(customer);
}
transaction.commit();
}
3.4 HQL的排序查询
在HibernateDemo1.java中新建方法:
@Test
/**
*
* @Title: demo4
* @Description: HQL的排序查询
* @param
* @return void
* @throws
*
*/
public void demo4() {
Session session = HibernateUtils.getCurrentSession();
Transaction transaction = session.beginTransaction();
// 排序的查询
//默认情况,升序,或使用asc
// List<Customer> list = session.createQuery("from Customer order by cust_id").list();
//设置降序排序
List<Customer> list = session.createQuery("from Customer order by cust_id desc").list();
for (Customer customer : list) {
System.out.println(customer);
}
transaction.commit();
}
3.5 HQL的条件查询
在HibernateDemo1.java中新建方法:
@Test
/**
*
* @Title: demo5
* @Description: HQL的排序查询
* @param
* @return void
* @throws
*
*/
public void demo5() {
Session session = HibernateUtils.getCurrentSession();
Transaction transaction = session.beginTransaction();
// 条件的查询
// 1.按位置绑定
// Query query= session.createQuery("from Customer where cust_name = ?0");
// query.setParameter(0, "李二");
// List<Customer> list = query.list();
// Query query = session.createQuery("from Customer cust where cust.cust_source
// = ?0 and cust.cust_name like ?1");
// query.setParameter(0, "网络推广");
// query.setParameter(1, "李%");
// List<Customer> list = query.list();
// 2.按名称绑定
//带别名
// Query query = session
// .createQuery("from Customer cust where cust.cust_source = :aaa and cust.cust_name like :bbb");
// query.setParameter("aaa", "网络推广");
// query.setParameter("bbb", "李%");
// List<Customer> list = query.list();
//不带别名
Query query = session
.createQuery("from Customer where cust_source = :aaa and cust_name like :bbb");
query.setParameter("aaa", "网络推广");
query.setParameter("bbb", "李%");
List<Customer> list = query.list();
for (Customer customer : list) {
System.out.println(customer);
}
transaction.commit();
}
3.6 HQL的投影查询
投影查询:不是查询对象的所有属性,而是某个或者某些属性。
1. 单个查询
在HibernateDemo1.java中新建方法:
@Test
/**
*
* @Title: demo6
* @Description: HQL的投影查询
* @param
* @return void
* @throws
*
*/
public void demo6() {
Session session = HibernateUtils.getCurrentSession();
Transaction transaction = session.beginTransaction();
// 投影查询
// 单个属性
List<Object> list = session.createQuery("select c.cust_name from Customer c").list();
for (Object object : list) {
System.out.println(object);
}
transaction.commit();
}
![](https://img.haomeiwen.com/i16102290/bc9a92871e1add76.png)
2. 多个查询
@Test
/**
*
* @Title: demo6
* @Description: HQL的投影查询
* @param
* @return void
* @throws
*
*/
public void demo6() {
Session session = HibernateUtils.getCurrentSession();
Transaction transaction = session.beginTransaction();
// 投影查询
List<Object[]> list = session.createQuery("select c.cust_name,c.cust_source from Customer c").list();
for (Object[] objects : list) {
System.out.println(Arrays.toString(objects));
}
transaction.commit();
}
3. 多个查询后封装到对象中
涉及到封装,需要在JavaBean类中重写方法。
Customer.java
public class Customer {
public Customer() {
super();
}
public Customer(String cust_name, String cust_source) {
super();
this.cust_name = cust_name;
this.cust_source = cust_source;
}
…………
}
这里用eclipse的快捷生成方式:
![](https://img.haomeiwen.com/i16102290/8cf2613f9df52063.png)
HibernateDemo1.java
@Test
/**
*
* @Title: demo6
* @Description: HQL的投影查询
* @param
* @return void
* @throws
*
*/
public void demo6() {
Session session = HibernateUtils.getCurrentSession();
Transaction transaction = session.beginTransaction();
// 投影查询
// 查询多个属性,但还是想封装到对象中
List<Customer> list = session.createQuery("select new Customer(cust_name,cust_source) from Customer").list();
for (Customer customer : list) {
System.out.println(customer);
}
transaction.commit();
}
![](https://img.haomeiwen.com/i16102290/5863cc290321eaf3.png)
3.7 HQL的分页查询
从第12个开始,每10个一页查询。
在HibernateDemo1.java中新建方法:
@Test
/**
*
* @Title: demo7
* @Description: HQL的分页查询
* @param
* @return void
* @throws
*
*/
public void demo7() {
Session session = HibernateUtils.getCurrentSession();
Transaction transaction = session.beginTransaction();
Query query = session.createQuery("from LinkMan");
query.setFirstResult(11);
query.setMaxResults(10);
List<LinkMan> list = query.list();
for (LinkMan linkMan : list) {
System.out.println(linkMan);
}
transaction.commit();
}
![](https://img.haomeiwen.com/i16102290/31ed2a7b903b1a0d.png)
3.8HQL的分组统计查询
查看如下两个SQL功能:
1. 统计存储数据的数目
![](https://img.haomeiwen.com/i16102290/74aaac37b3ec8ea4.png)
在HibernateDemo1.java中新建方法:
@Test
/**
*
* @Title: demo8
* @Description: HQL的分组统计查询
* @param
* @return void
* @throws
*
*/
public void demo8() {
Session session = HibernateUtils.getCurrentSession();
Transaction transaction = session.beginTransaction();
// 统计表中总的记录数目,uniqueResult()返回唯一结果
//聚合函数的使用:count(),max(),min(),avg(),sum()在HQL中都可以用
Object object = session.createQuery("select count(*) from Customer").uniqueResult();
System.out.println(object);
transaction.commit();
}
![](https://img.haomeiwen.com/i16102290/c8188cf084e0bcc6.png)
2. 通过客户来源从客户表中统计数据的个数。
![](https://img.haomeiwen.com/i16102290/a9aebda410642f38.png)
在HibernateDemo1.java中修改demo8()方法:
/**
*
* @Title: demo8
* @Description: HQL的分组统计查询
* @param
* @return void
* @throws
*
*/
public void demo8() {
Session session = HibernateUtils.getCurrentSession();
Transaction transaction = session.beginTransaction();
// 分组统计
// 根据客户的来源统计客户的个数
List<Object[]> list = session.createQuery("select cust_source ,count(*) from Customer group by cust_source")
.list();
for (Object[] objects : list) {
System.out.println(Arrays.toString(objects));
}
transaction.commit();
}
![](https://img.haomeiwen.com/i16102290/d7052ac3e83d91c0.png)
修改一下数据库:
![](https://img.haomeiwen.com/i16102290/c2056628c219e56f.png)
通过客户来源从客户表中统计来源人数大于2的数据的个数。
@Test
/**
*
* @Title: demo8
* @Description: HQL的分组统计查询
* @param
* @return void
* @throws
*
*/
public void demo8() {
Session session = HibernateUtils.getCurrentSession();
Transaction transaction = session.beginTransaction();
// 分组统计
// 根据客户来源从客户表中统计来源人数大于2的数据的个数
List<Object[]> list = session.createQuery("select cust_source ,count(*) from Customer group by cust_source having count(*) >= 2")
.list();
for (Object[] objects : list) {
System.out.println(Arrays.toString(objects));
}
transaction.commit();
}
![](https://img.haomeiwen.com/i16102290/d5537770d26b55bc.png)
END
网友评论