Hibernate的查询方式(大全)(检索方式)OID查询+ HQL检索 +QBC检索+SQL检索

/*

  • 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开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:Java)

写在最后

还有一份JAVA核心知识点整理(PDF):JVM,JAVA集合,JAVA多线程并发,JAVA基础,Spring原理,微服务,Netty与RPC,网络,日志,Zookeeper,Kafka,RabbitMQ,Hbase,MongoDB,Cassandra,设计模式,负载均衡,数据库,一致性哈希,JAVA算法,数据结构,加密算法,分布式缓存,Hadoop,Spark,Storm,YARN,机器学习,云计算…

image

《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!
ransaction();

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-VsCXWtsG-1713854974419)]

[外链图片转存中…(img-2bvr0lvh-1713854974420)]

[外链图片转存中…(img-clddhfFv-1713854974420)]

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:Java)

[外链图片转存中…(img-uKz4SoLp-1713854974420)]

写在最后

还有一份JAVA核心知识点整理(PDF):JVM,JAVA集合,JAVA多线程并发,JAVA基础,Spring原理,微服务,Netty与RPC,网络,日志,Zookeeper,Kafka,RabbitMQ,Hbase,MongoDB,Cassandra,设计模式,负载均衡,数据库,一致性哈希,JAVA算法,数据结构,加密算法,分布式缓存,Hadoop,Spark,Storm,YARN,机器学习,云计算…

[外链图片转存中…(img-BAhp0XHJ-1713854974421)]

《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!

  • 17
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
引用\[1\]:使用@ManyToOne注解可以实现关联非主键列的连表查询。在这个例子中,通过@ManyToOne注解将CaseInfoModel与另一个表关联起来,使用@JoinColumn指定了关联的列名和参考列名。\[1\] 引用\[2\]:在Hibernate中,可以使用OID数据查询和OGN数据查询方式进行连表查询。在这个例子中,通过session.get方法查询User表中的数据,并打印结果。\[2\] 引用\[3\]:如果需要从两个表中查询带有where条件的数据,可以使用HQL语句。在这个例子中,使用了select语句和where条件来查询FileModel和StatusModel表中符合条件的数据。\[3\] 综上所述,以上是Hibernate中连表查询的一些示例。具体的连表查询方式还取决于具体的业务需求和数据模型。 #### 引用[.reference_title] - *1* *3* [Hibernate 多表联查](https://blog.csdn.net/Memory166/article/details/112365946)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [hibernate的基础学习--多表关联数据查询](https://blog.csdn.net/diaochifu3136/article/details/101329656)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值