/*
- HQL 的查询方式的测试类
*/
public class HibernateDemo1 {
@Test
// 初始化数据
public void demo01() {
Session session = HibernateUtils.getCurrentSession();
Transaction transaction = session.beginTransaction();
// 创建一个客户
Customer customer = new Customer();
customer.setCust_name(“李冰”);
for (int i = 1; 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();
}
}
初始化三组联系人和客户
B、HQL的简单查询
(1)HQL的简单查询
两个对象相互包含的时候注意toString,最好不要写对象的集合,因为这是个死循环
@Test
// HQL的简单查询
public void demo02() {
Session session = HibernateUtils.getCurrentSession();
Transaction transaction = session.beginTransaction();
//得到所有的客户
Query query = session.createQuery(“from Customer”);
List list = query.list();
for (Customer customer : list) {
System.out.println(customer);
}
transaction.commit();
}
注意SQL当中支持*号的写法:例如 :select * from cst_customer
,但是在HQL当中不支持 * 的写法。
Query query = session.createQuery(“from * Customer”);//是错误的写法,运行代码时会报错
也可以这样查询
(2.0)HQL别名查询
@Test
// 别名查询
public void demo03() {
Session session = HibernateUtils.getCurrentSession();
Transaction transaction = session.beginTransaction();
// 得到所有的客户
//别名查询
Query query = session.createQuery(“from Customer c”);//c是Customer的别名
List list = query.list();
for (Customer customer : list) {
System.out.println(customer);
}
transaction.commit();
}
(2.1)HQL别名查询
@Test
// 别名查询
public void demo03() {
Session session = HibernateUtils.getCurrentSession();
Transaction transaction = session.beginTransaction();
// 得到所有的客户
//别名查询
Query query = session.createQuery(“select c from Customer c”);//c是Customer
List list = query.list();
for (Customer customer : list) {
System.out.println(customer);
}
transaction.commit();
}
C:HQL的排序查询
(1)默认排序:升序排序
@Test
// 排序查询
public void demo04() {
Session session = HibernateUtils.getCurrentSession();
Transaction transaction = session.beginTransaction();
// 得到所有的客户
// 排序查询
List list = session.createQuery(“from Customer order by cust_id”).list();// c是Customer
for (Customer customer : list) {
System.out.println(customer);
}
transaction.commit();
}
(2)设置降序排序
@Test
// 排序查询
public void demo04() {
Session session = HibernateUtils.getCurrentSession();
Transaction transaction = session.beginTransaction();
// 得到所有的客户
// 降序查询
List list = session.createQuery(“from Customer order by cust_id desc”).list();// c是Customer
for (Customer customer : list) {
System.out.println(customer);
}
transaction.commit();
}
升序使用asc降序使用desc
D:HQL的条件查询
(一)按位置绑定:根据参数的位置进行绑定。
(1)一个条件
@Test
// 条件查询
public void demo05() {
Session session = HibernateUtils.getCurrentSession();
Transaction transaction = session.beginTransaction();
// 条件查询
// 一、按位置绑定
Query query = session.createQuery(“from Customer where cust_name = ?”);// c是Customer
query.setParameter(0, “李冰”);
List list = query.list();
// 二、按名称绑定
for (Customer customer : list) {
System.out.println(customer);
}
transaction.commit();
}
(2)多个条件(模糊查询)
@Test
// 条件查询
public void demo05() {
Session session = HibernateUtils.getCurrentSession();
Transaction transaction = session.beginTransaction();
// 条件查询
// 一、按位置绑定
Query query = session.createQuery(“from Customer where cust_source = ? and cust_name like ?”);
query.setParameter(0, “小广告”);
query.setParameter(1, “李%”);
List list = query.list();
for (Customer customer : list) {
System.out.println(customer);
}
transaction.commit();
}
(二)按名称绑定匿名名称
@Test
// 条件查询
public void demo05() {
Session session = HibernateUtils.getCurrentSession();
Transaction transaction = session.beginTransaction();
// 条件查询
// 二、按名称绑定
Query query = session.createQuery(“from Customer where cust_source = :aaa and cust_name like :bbb”);
//设置参数
query.setParameter(“aaa”, “朋友推荐”);
query.setParameter(“bbb”, “李%”);
List list = query.list();
for (Customer customer : list) {
System.out.println(customer);
}
transaction.commit();
}
E:HQL的投影查询
投影查询:指的是查询对象的某个或某些属性。
(1)单个属性投影查询
@Test
// 投影查询
public void demo06() {
Session session = HibernateUtils.getCurrentSession();
Transaction transaction = session.beginTransaction();
// 投影查询,查询当中的一个属性
List list = session.createQuery(“select c.cust_name from Customer c”).list();
for (Object object : list) {
System.out.println(object);
}
transaction.commit();
}
(2)多个属性投影查询
@Test
// 投影查询
public void demo06() {
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)查询多个属性分装到对象当中投影查询
先对要查询的对象写入构造方法
@Test
// 投影查询
public void demo06() {
Session session = HibernateUtils.getCurrentSession();
Transaction transaction = session.beginTransaction();
// 查询多个属性,分装到对象当中
List list = session.createQuery(“select new Customer(cust_name,cust_source) from Customer”).list();
for (Customer customer : list) {
System.out.println(customer);
}
transaction.commit();
}
F:HQL的分页查询
@Test
// 分页查询
public void demo07() {
Session session = HibernateUtils.getCurrentSession();
Transaction transaction = session.beginTransaction();
// 分页查询
Query query = session.createQuery(“from LinkMan”);
query.setFirstResult(0);
query.setFirstResult(10);
List list = query.list();
for (LinkMan linkMan : list) {
System.out.println(linkMan);
}
transaction.commit();
}
注意在LinkMan当中也要生成对应的toString 方法
G:HQL的分组统计查询
(1)分组查询
@Test
// 分组统计查询
public void demo08() {
Session session = HibernateUtils.getCurrentSession();
Transaction transaction = session.beginTransaction();
//聚合函数的使用:聚合函数包括:count(),max(),min(),avg(),sum()
//代表唯一结果uniqueResult
Object object = session.createQuery(“select count(*) from Customer”).uniqueResult();
System.out.println(object);
transaction.commit();
}
(2)分组统计(按照客户的来源统计客户的个数)
SQL语句:SELECT cust_source,COUNT(*) FROM cst_customer GROUP BY cust_source;
转换HQL将字段变为属性,把表的地方变为对象
@Test
// 分组统计查询
public void demo08() {
Session session = HibernateUtils.getCurrentSession();
Transaction transaction = session.beginTransaction();
List<Object[]> list = session.createQuery(“select cust_source,count(*) from Customer group by cust_source”).list();//代表唯一结果uniqueResult
for (Object[] objects : list) {
System.out.println(Arrays.toString(objects));
}
transaction.commit();
}
限定条件
SQL语句:SELECT cust_source,COUNT(*) FROM cst_customer GROUP BY cust_source HAVING count(*) >= 2;
@Test
// 分组统计查询
public void demo08() {
Session session = HibernateUtils.getCurrentSession();
Transaction transaction = session.beginTransaction();
List<Object[]> list = session.createQuery(“select cust_source,count() from Customer group by cust_source HAVING count() >= 2”).list();//代表唯一结果uniqueResult
for (Object[] objects : list) {
System.out.println(Arrays.toString(objects));
}
transaction.commit();
}
总结聚合函数
聚合函数的使用:聚合函数包括:count(),max(),min(),avg(),sum()
聚合函数 count(),求数据表的行数
select count(*/字段名) from 数据表
聚合函数 max(),求某列的最大数值
select max(字段名)from 数据表
聚合函数min(),求某列的最小值
select main(字段名) from 数据表
聚合函数sum(),对数据表的某列进行求和操作
select sum(字段名) from 数据表
聚合函数avg(),对数据表的某列进行求平均值操作
select avg(字段名) from 数据表
聚合函数和分组一起使用
select count(*),group_concat(age) from students group by age;
F:HQL的多表查询
a、SQL当中的多表查询
连接查询
i、交叉连接:笛卡尔积
A,B 代表两个表,,这种查询方式一般不用
select * from A,B;
ii、内链接 : inner join
(inner可以省略) 内链接查到的是两个表的交
{
隐式内链接 :
A 和 B 是两个表 A.id和B.id 分别对应两个表的关联字段
select * from A,B where A.id=B.id;
显示内链接 :
A 和 B 是两个表 A.id和B.id 分别对应两个表的关联字段
select * from A inner join B on A.id = B.id;
}
iii、外链接 外链接查询到的是两个表的交集以及left 或right对应的数据
{
左外链接 :left outer join(outer 可以省略)
select * from A left outer join B on A.id = B.id;
右外链接 : right outer join(outer 可以省略)
select * from A right outer join B on A.id = B.id;
}
b、HQL当中的多表查询
链接查询
交叉连接
内链接
显式内连接:封装成为数组
隐式内连接 from Customer c inner join c.linkMans
:封装成为数组
@Test
// HQL多表的查询
public void demo09() {
Session session = HibernateUtils.getCurrentSession();
Transaction transaction = session.beginTransaction();
// SQL:SELECT * FROM cst_customer c INNER JOIN cst_linkman l ON c.cust_id =
// l.lkm_cust_id;
// HQL的内连接:from Customer c inner join c.linkMans
Query createQuery = session.createQuery(“from Customer c inner join c.linkMans”);
List<Object[]> list = createQuery.list();
for (Object[] objects : list) {
System.out.println(Arrays.toString(objects));
}
transaction.commit();
}
迫切内连接:(会将当前表外键对应的另外一个表当中的的数据都分装当中当前表对应的对象当中)封装成为对象
@Test
// HQL多表的查询
public void demo09() {
Session session = HibernateUtils.getCurrentSession();//建立连接
Transaction transaction = session.beginTransaction();//开启事务
// SQL:SELECT * FROM cst_customer c INNER JOIN cst_linkman l ON c.cust_id =
// l.lkm_cust_id;
// HQL:迫切内连接 其实就是在普通的内连接inner join后添加一个关键字叫fetch --> from Customer c inner join
// fetch c.linkMans
// fetch通知Hibernate,将另一个对象的数据封装到该对象当中,也就是前面的对象当中(将LinkMan当中的数据放到Customer当中)
List list = session.createQuery(“from Customer c inner join fetch c.linkMans”).list();
for (Customer customer : list) {
System.out.println(customer);
}
transaction.commit();
}
获取到的内容是将LinkMan当中的东西分装到了Customer当中,并且数据冗余
改进上述查询方式 关键词 DISTINCT 用于返回唯一不同的值。
SELECT DISTINCT 列名称 FROM 表名称
@Test
// HQL多表的查询
public void demo09() {
Session session = HibernateUtils.getCurrentSession();
Transaction transaction = session.beginTransaction();
// SQL:SELECT * FROM cst_customer c INNER JOIN cst_linkman l ON c.cust_id =
// l.lkm_cust_id;
// HQL:迫切内连接 其实就是在普通的内连接inner join后添加一个关键字叫fetch --> from Customer c inner join
// fetch c.linkMans
// fetch通知Hibernate,将另一个对象的数据封装到该对象当中,也就是前面的对象当中(将LinkMan当中的数据放到Customer当中)
List list = session.createQuery(“select distinct c from Customer c inner join fetch c.linkMans”).list();
for (Customer customer : list) {
System.out.println(customer);
}
transaction.commit();
}
外链接
左外连接:封装成数组
右外连接:封装成数组
迫切左外连接:封装成对象
4、Hibernate的查询方式:QBC检索
QBC查询:Query By Criteria,叫做条件查询。是一种更加面向对象化的查询方式。
Criteria是一种比hql更面向对象的查询方式
(1)简单查询
通过session或者Criteria对象
criteria对象获取集合
@Test
// 简单的查询
public void demo01() {
Session session = HibernateUtils.getCurrentSession();
Transaction tx = session.beginTransaction();
// 获得Criteria的对象
Criteria criteria = session.createCriteria(Customer.class);
List list = criteria.list();
for (Customer customer : list) {
System.out.println(customer);
}
tx.commit();
}
(2)排序查询 criteria.addOrder(Order.条件)添加排序
a、升序排序
@Test
public void demo02() {
Session session = HibernateUtils.getCurrentSession();
Transaction tx = session.beginTransaction();
Criteria criteria = session.createCriteria(Customer.class);
criteria.addOrder(Order.asc(“cust_id”));//升序
List list = criteria.list();
for (Customer customer : list) {
System.out.println(customer);
}
tx.commit();
}
b、降序排序
@Test
public void demo02() {
Session session = HibernateUtils.getCurrentSession();
Transaction tx = session.beginTransaction();
Criteria criteria = session.createCriteria(Customer.class);
criteria.addOrder(Order.desc(“cust_id”));//降序
List list = criteria.list();
for (Customer customer : list) {
System.out.println(customer);
}
tx.commit();
}
最后
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数Java工程师,想要提升技能,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助。
因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,不论你是刚入门Java开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门!
如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
}
b、降序排序
@Test
public void demo02() {
Session session = HibernateUtils.getCurrentSession();
Transaction tx = session.beginTransaction();
Criteria criteria = session.createCriteria(Customer.class);
criteria.addOrder(Order.desc(“cust_id”));//降序
List list = criteria.list();
for (Customer customer : list) {
System.out.println(customer);
}
tx.commit();
}
最后
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数Java工程师,想要提升技能,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助。
因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
[外链图片转存中…(img-y6s6vUXY-1715690957114)]
[外链图片转存中…(img-yP7NzbrA-1715690957115)]
[外链图片转存中…(img-UciyhQWW-1715690957115)]
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,不论你是刚入门Java开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门!
如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!