原本以前学过Hibernate的,可是近期接到一个项目,为了方便开发,还有考虑到对Hibernate的不足,从新花了4天由浅入深学了下。 数据库
在此,Hibernate里面涉及到多种查询的方法,可是每一个方法特性并不同,经常使用的就基本有四种,固然,或许本人还学的不过广,可是通过各类百度谷歌,主要出现就是这四种,load,get,Query,Criteria。 缓存
首先说下load与get的区别: fetch
load方法得到的是对应参数的类的代理对象,看清楚,是代理对象,而get方法是对应参数的类的对象。这两种有神马区别,load方法得到的代理对象,若是你没有对其调用里面的方法等等,Hibernate是不会发出SQL语句去查询数据库里面的内容,可是get方法一使用,Hibernate立马就发出SQL语句去查询数据库里面的内容。这意味着,会出现,当数据库中没有对应Id的数据存在时,get方法是返回null值,这很好,对咱们的程序影响并不大,但是load的话,由于一开始是得到代理对象,因此并不是null值,这样你不能知道到底数据库有没有该数据存在,只有当你使用该代理对象的时候,Hibernate才发出SQL语句,这时当数据库没有该数据,那么系统就会报ObjectNotFoundException异常。还有,当你调用完了相应的方法时关闭了Session,那么get方法没有影响,而load方法会出现异常。 代理
get的话,会到一级缓存查找是否已存在的对象,而load会先从一级缓存查找再到二级缓存查找。 对象
接下来讲下Query和Criteria查询的区别: 开发
最明显的区别在于,Query是HQL\EJB QL 语言进行查询的,格式很像SQL语句,不过HQL\EJB QL是符合OO查询的,也就是SQL里面指定表名而HQL是指定类名,格式我就不在这里多写。而Criteria呢是经过要查找的类做为参数进行查询,这中类型跟load和get类似,再经过添加约束来进一步实现查询。 get
还有一个区别,Criteria对于一对多多对一关系不会出现N+1问题,而Query则会出现该问题,固然Query能够进行限制来防止这种状况发生,例如设置fetch为Lazy,或是在HQL加上left join链接,或是使用BethSize(不推荐,灵活性差) it