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)会返回Customer与Order持久化对象,并被置于Hibernate的Session缓存之中,并且Session会负责它们在缓存中的唯一性以及与后台数据库数据的同步,只有事务提交后它们才会从缓存中被清除;
- 语句(2)返回的是非是持久化对象,不会占用Hibernate的Session缓存,只要在检索之后应用程序不在访问它们,它们所占用的内存就有可能被JVM 的垃圾回收器回收,而且Hibernate不会同步对它们的修改。
总结
开发中,不可避免的要进行统计查询的开发,这类功能有两个特点:
- 数据量大;
- 一般情况下都是只读操作而不会涉及到对统计数据进行修改;
如果
- 如果用(1),大量持久化对象位于Hibernate的Session缓存中,而且Hibernate的 Session缓存还要负责它们与数据库数据的同步。
- 如果用(2),会提高查询性能,因为不需要Hibernate的Session缓存的管理开销,而且只要应用程序不在使用这些数据,它们所占用的内存空间就会被回收释放。
- 因此在统计查询系统时,尽量使用通过select语句写出需要查询的属性的方式来返回关系数据,而避免使用第一种查询方式返回持久化对象(这种方式是在有修改需求时使用比较适合),这样可以提高运行效率并且减少内存消耗。