Hibernate内置的几个经典通用API

Hibernate API地址:http://docs.jboss.org/hibernate/core/3.6/javadocs/org/hibernate/criterion/Projections.html

Hibernate 学习地址:http://my.oschina.net/u/274427/blog/68528

本文参考地址:http://blessht.iteye.com/blog/1327883

 A:简单HQL语句查询

      执行HQL需要创建Query对象:getSession().createQuery(hql语句);

            千万注意:HQL语句中的表名和字段名不是数据库的表名和字段名,而是对应ORM映射POJO的类名和属性名!

                   被查询表中如果有外键关联,在执行查询时能将外键关联字段的值查询出来,但如果想查询关联表的其它字段会另外发SQL,这个特别要注意!

 B:简单SQL语句查询

           Hibernate同样支持写SQL,对原生SQL查询执行的控制是通过SQLQuery接口进行的,通过执行Session.createSQLQuery()获取这个接口

C:hibernate条件查询(Criteria)

       获取Hibernate的Criteria对象方法:getSession().createCriteria(Class对象);

D:数据库查询核心是条件,绝大多数SQL都会带有WHERE子句,下面介绍简单的WHERE查询

     [1]使用HQL“WHERE 字段=?”的形式给条件赋值<--- 通过query.setParameter(int,Obejct)方法即可给每个?赋值,注意第一个参数是从下标0开始!

         [2]使用HQL “WHERE 字段=:key”的形式给条件赋值<-----调用setParameter(String,Object)和setParameterList两个方法,前者是赋单一值,后者是赋多个值(特别适合in查询赋值)。这两种赋值方法都需要传两参数:第一个参数是key值,对应HQL语句中的“:xxx”;第二个参数是value值,就对应key的实际值。这种传值比3-1-1更准确方便:一来不用担心下标错位的问题,二来如果存在”xx,xx,xx”这种格式的参数可以使用setParameterList方法,屡试不爽!

       以上两个方法是使用HQL语句的,对应的还有使用SQL的两种方法,这两个的区别是

           HQL对应的是Java实体对象的属性,SQL对应的是数据库中表的列

(1)新增一个POJO到数据库:this.getSession().save(arg0)传入参数是一个POJO对象,一定要有hbm.xml映射,Hibernate会根据对象类型发送新增SQL到数据库

(2)更新一条表数据,:this.getSession().update(arg0)传入参数是一个POJO对象,必须有ID,Hibernate会根据id更新数据,而且此方法会将POJO对象所有属性进行更新,也就是说假设Member表login_code为”kaka”,而执行update时Member对象中的logincode未设值,则最终表的login_code值会为null

(3)删除一条表数据:this.getSession().delete(arg0)传入参数是一个POJO对象,必须有ID,其它属性值可以不要

(4)查询操作this.getSession().get(arg0, arg1)传入参数arg0:POJO的Class,参数arg1:POJO的id,根据主键id查询一条字段数据

(5)延迟查询 this.getSession().load(arg0, arg1)传入参数与上面的get方法相同,功能也是根据id查询一条字段,唯一不同的是:get是调用该方法就发送SQL语句并返回数据;load是当使用返回对象时才发送SQL语句查询,如下代码

Member m = …load(Member.class,id);  
Thread.sleep(1000);  
m.getId();  

 上面的代码肯定要发一条SQL语句查询Member表,如果用的是load方法,则是在睡眠完成运行m.getId()才发送SQL语句;而如果用的是get方法,则是在调用get方法就发送SQL语句了。

!!!!经典的更新操作

从上面的update语句中我们能看到一个弊端:不能定制更新个别字段,只能更新全部字段。Hibernate提供了一种持久化状态的更新机制,这种更新方法非常奇妙:

Member member = (Member) getSession().get(Member.class, id);  
member.setLoginCode("akaka");  
member.setPassword("654321");  

 猜想上面这段代码会发几句SQL?根据控制台调试发现总共发了两句SQL:一句是SELECT语句查询Member表,另一句是UPDATE语句更新Member表字段,最终查询数据库时发现logincode和password的值都变成了上面设置的值。

这是一种非常好使的UPDATE方法,不用写SQL语句,直接先get后set即可自动发送SQL。

相关推荐