Hibernate合集(第二章) HQL使用

本文介绍了Hibernate的三种状态及HQL查询的使用,重点讨论了统计查询的优化。在只读操作且数据量大的场景下,建议使用非持久化对象的查询方式以提高性能并减少内存消耗。通过对比HQL的内连接查询与传统查询,揭示了选择适当查询方式对于统计查询系统的重要性。
摘要由CSDN通过智能技术生成

Hibernate合集

第一章 Hibernate 三种状态
第二章 HQL使用


一、查询

单表查询

持久态

// return User
from User user where user.age=20;
from User user where user.age between 20 and 30;
from User user where user.id in(20,30);
from User user where user.age=20 and
(user.name is null or user.name like '%zx%');

属性查询

Detached 游离态

select user.name from User user;// list<String>
select user.name,user.age from User user;// List<Object[]>
select new User(user.name,user.age) from User user;// User

group

select count(user),user.age
from User user group by user.age having count(user)>10

二、条件

属性

Query query=session.createQuery("from User user
where user.name=:customerName");
query.setString("customerName",name);

实体

Customer customer=new Customer();
customer.setName(“pansl”);
customer.setAge(80);
Query query=session.createQuery("from Customer c
where c.name=:name and c.age=:age");
query.setProperties(customer);
Customer customer=(Customer)session.load(Customer.class, 1);
Query query=session.createQuery("from Order order
where order.customer=:customer");
query.setProperties("customer",customer);

三、单表更新/删除

update User user set user.age=20 where user.age=18;

delete from User user where user.age=18;

四、关联查询

from Customer c inner join c.orders o group by c.age;// (1)

select
 c.ID,c.name,c.age,o.ID,o.order_number,o.customer_ID
from Customer c inner join c.orders c
group by c.age;//(2)

都是HQL内连接查询,两条查询语句最后所返回的结果是一样的,但是有明显区别,

  1. 语句(1)会返回Customer与Order持久化对象,并被置于Hibernate的Session缓存之中,并且Session会负责它们在缓存中的唯一性以及与后台数据库数据的同步,只有事务提交后它们才会从缓存中被清除;
  2. 语句(2)返回的是非是持久化对象,不会占用Hibernate的Session缓存,只要在检索之后应用程序不在访问它们,它们所占用的内存就有可能被JVM 的垃圾回收器回收,而且Hibernate不会同步对它们的修改。

总结

开发中,不可避免的要进行统计查询的开发,这类功能有两个特点:

  1. 数据量大;
  2. 一般情况下都是只读操作而不会涉及到对统计数据进行修改;

如果

  1. 如果用(1),大量持久化对象位于Hibernate的Session缓存中,而且Hibernate的 Session缓存还要负责它们与数据库数据的同步。
  2. 如果用(2),会提高查询性能,因为不需要Hibernate的Session缓存的管理开销,而且只要应用程序不在使用这些数据,它们所占用的内存空间就会被回收释放。
  3. 因此在统计查询系统时,尽量使用通过select语句写出需要查询的属性的方式来返回关系数据,而避免使用第一种查询方式返回持久化对象(这种方式是在有修改需求时使用比较适合),这样可以提高运行效率并且减少内存消耗。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值