浅谈Hibernate中的几个查询

一、load和get方法的区别

1、load在查询时,先从一级缓存中寻找与数据索引对应的实体对象,然后构建并返回一个代理对象,当我们真正使用这个代理对象的时候,这时候才会进入二级缓存查找或到数据库加载数据,如果数据库中没有找到则抛出一个ObjectNotFoundException;

2、get方法在查询时,同样是先从一级缓存中寻找与数据索引对应的实体对象,如果有则直接返回该实体对象,如果没有则马上进入二级缓存查找或到数据库加载数据,查找到则直接返回查询对象,没有则返回一个null;

二、list和iterator

1 、list方法会直接直接到数据库中加载数据,然后将查询结果放入缓存中,当然如果你配置了查询缓存,他会先进入查询缓存寻找,如果没有满足条件的再进入数据库加载数据;

2、iterator方法在查询时是先从数据库中查询出所有满足条件的数据索引,然后再根据这些数据索引进入一级和二级缓存进行匹配,如果对于数据索引有实体对象则直接返回该对象,如果没有则在具体使用对象的时候才会进入数据库加载数据,并且把数据索引和对于实体对象放进缓存;

3、什么时候使用最合适呢?个人建议第一次查询使用list直接从数据库中读取所有数据,然后放到了缓存中,后面使用Iterator,直接从缓存中读取,利于提高性能;

三、延迟加载


1、对于load方法,它在查询对象的时候始终返回的一个代理对象,那么为什么hibernate要引入这么一个方式呢,为什么不像get方法一样直接返回查询对象呢?出于对hibernate的性能考虑,hibernate则提出了一个解决方案,那就是延迟加载,这里load方法的使用则正是实体对象延迟加载的表现。


2、hibernate中list和Iterator 区别,延迟加载

对于Query接口的list()和Iterator()方法来说,都可以实现获取查询的对象,但是list() 方法返回的是每一个对象都是完整的(对象的每一个属性都被表中的字段填充上了),而Iterator()方法返回的对象中仅包含了主键值(标识符),只有当你对Iterator中的对象进行操作时,Hibernate才会向数据库发送SQL语句来获取属性值。
Iterator操作代码
Query q = session.createQuery("from UserModel");
Iterator<UserModel> iter = q.iterate();
while(iter.hasNext()){
System.out.println(iter.next());
}
list操作代码
Query q = session.createQuery("from UserModel");
List<UserModel> list = q.list();
for(Iterator<UserModel> iter = list.iterator();iter.hasNext();){
System.out.println(iter.next());