)hibernate常用API详解分类:Hibernate2013-05-2518:551251人阅读评论(0)收藏举报转自:常用API详解以下示例均以两张表为例:member和userinfo,member帐号信息表外键关联userinfo用户基本信息表,主键自动生成即可然后映射出的POJO如下:publicclassUserinfoimplementsSerializable{//primarykeyprivatejava.lang.Integerid;//fieldsprivatejava.lang.Stringname;privatejava.lang.Stringcode;privatejava.lang.Stringbirthday;privatejava.lang.Stringaddress;privatejava.util.DatecreateTime;privatejava.lang.IntegerdeleteFlag;//collectionsprivatejava.util.Setcom.bless.model.Membermembers;//省略gettersetter}publicclassMemberimplementsSerializable{//primarykeyprivatejava.lang.Integerid;//fieldsprivatejava.lang.StringloginCode;privatejava.lang.Stringpassword;privatejava.lang.IntegerdeleteFlag;//manytooneprivatecom.bless.model.UserinfofkUserinfo;//省略gettersetter}1、Hibernate提供多种方法查询数据库数据下面以一个最简单的查询为例:SELECT*FROMTABLE为例1-1简单HQL语句查询Hibernate提供了HQL查询,HQL是Hibernate推荐语句,它屏蔽了不同数据库SQL不兼容的问题,使用HQL写的查询语句在主流数据库上都能执行。执行HQL需要创建Query对象:getSession().createQuery(hql语句);简单HQL格式:FROMPOJO对应SQL语句:SELECT*FROMPOJO对应的表名千万注意:HQL语句中的表名和字段名不是数据库的表名和字段名,而是对应ORM映射POJO的类名和属性名!Java代码1.Queryquery=baseDao.getQuery(FROMMember);2.ListMemberlstM=query.list();3.for(Membermember:lstM){4.System.out.println(id:+member.getId()+fk_id:+member.getFkUserinfo().getId());5.}结果:一句SQL将所有结果查询出来如果修改一下for循环的代码,查询FK的name:Java代码1.for(Membermember:lstM){2.System.out.println(id:+member.getId()+fk_id:+member.getFkUserinfo().getName());3.}结果:一句SQL查询Member表,每一次for循环又发一句SQL查询Userinfo表总结:被查询表中如果有外键关联,在执行查询时能将外键关联字段的值查询出来,但如果想查询关联表的其它字段会另外发SQL,这个特别要注意!1-2简单SQL语句查询Hibernate同样支持写SQL,对原生SQL查询执行的控制是通过SQLQuery接口进行的,通过执行Session.createSQLQuery()获取这个接口Java代码1.SQLQuerysql=baseDao.getSQLQuery(SELECT*FROMmember);2.//查询出的结果放到指定POJO中3.sql.addEntity(Member.class);4.ListMemberlstM=sql.list();5.for(Membermember:lstM){6.System.out.println(id:+member.getId()+fk_id:+member.getFkUserinfo().getId());7.}结果:一句SQL将所有结果查询出来如果修改一下for循环的代码,查询FK的name,结果与前面使用HQL查询一样:一句SQL查询Member表,随后每一次for循环又发一句SQL查询Userinfo表1-3Hibernate条件查询(Criteria)HQL极为强大,但是有些人希望能够动态的使用一种面向对象API创建查询,而非在他们的Java代码中嵌入字符串。对于那部分人来说,Hibernate提供了直观的Criteria查询API。获取Hibernate的Criteria对象方法:getSession().createCriteria(Class对象);Java代码1.Criteriacrit=baseDao.getCriteria(Member.class);2.ListMemberlstM=crit.list();3.for(Membermember:lstM){4.System.out.println(id:+member.getId()+fk_id:+member.getFkUserinfo().getId());5.}其实上面这种方式就是发了一句SQL:SELECT*FROMmember结果:一句SQL将所有结果查询出来如果修改一下for循环的代码,查询FK的name,结果与前面情况一样2、在简单的selectfromtable基础上,加上分页和排序以此为例:查询第11条~20条数据,按照ID降序排列2-1使用HQLJava代码1.Queryquery=baseDao.getQuery(FROMMembermORDERBYm.idDESC);2.query.setFirstResult(10);3.query.setMaxResults(10);4.ListMemberlstM=query.list();5.for(Membermember:lstM){6.System.out.println(id:+member.getId()+fk_id:+member.getFkUserinfo().getId());7.}2-2使用SQLJava代码1.SQLQuerysql=baseDao.getSQLQuery(SELECT*FROMmembermORDERBYm.idDESC);2.sql.setFirstResult(10);3.sql.setMaxResults(10);4.//查询出的结果放到指定POJO中5.sql.addEntity(Member.class);6.ListMemberlstM=sql.list();7.for(Membermember:lstM){8.System.out.println(id:+member.getId()+fk_id:+member.getFkUserinfo().getId());9.}2-3使用CriteriaJava代码1.Criteriacrit=baseDao.getCriteria(Member.class);2.crit.setFirstResult(10);3.crit.setMaxResults(10);4.crit.addOrder(Order.desc(id));5.ListMemberlstM=crit.list();6.for(Membermember:lstM){7.System.out.println(id:+member.getId()+fk_id:+member.getFkUserinfo().getId());8.}3、数据库查询核心是条件,绝大多数SQL都会带有WHERE子句,下面介绍简单的WHERE查询以此为例:SELECT*FROMmembermWHEREm.login_codelike‘kaka%’ANDm.passwordin(‘12345’,‘123451’,’123452’)ANDm.delete_flag=0;这里面有like、in和=三种查询特别注意:绝对不推荐直接在SQL语句后面拼接参数值:“***WHEREid=”+id+”ANDnamelike”+name+”%”;这种方式可能会造成很严重的后果:每一个不同的id值都会在内存中创建一个SQL请求对象,如果id多并且多次执行该句SQL很可能出现宕机状况!推荐使用下面这些赋值方式,下面的方式都只会在内存中创建一个SQL请求对象。3-1-1使用HQL“WHERE字段=?”的形式给条件赋值这种打?号传值的方式在JDBC是非常常见的了,使用HQL语句也可以通过这种方式赋值:Java代码1.Queryquery=baseDao.getQuery(FROMMembermWHEREm.loginCodeLIKE?ANDm.passwordin(?,?,?)ANDm.deleteFlag=?);2.query.setParameter(0,kaka%);3.query.setParameter(1,12345);4.query.setParameter(2,123451);5.query.setParameter(3,123452);6.query.setParameter(4,0);7.ListMemberlstM=query.list();8.for(Membermember:lstM){9.System.out.println(id:+member.getId()+fk_id:+member.getFkUserinfo().getId());10.}通过query.setParameter(int,Obejct)方法即可给每个?赋值,注意第一个参数是从下标0开始!3-1-2使用HQL“WHERE字段=:key”的形式给条件赋值这种赋值方式是HQL特有的,什么意思呢,直接看例子分析:Java代码1.Queryquery=baseDao.getQuery(FROMMembermWHEREm.loginCodeLIKE:codeANDm.passwordin(:pwd)ANDm.deleteFlag=:flag);2.query.setParameter(code,kaka%);3.query.setParameterList(pwd,newString[]{12345,123451,123452});4.query.setParameter(flag,0);5.ListMemberlstM=query.list();6.for(Membermember:lstM){7.System.out.println(id:+member.getId()+fk_id:+member.getFkUserinfo().getId());8.}上面例子关键代码是Query调用setParameter(String,Object)和setParameterList两个方法,前者是赋单一值,后者是赋多个值(特别适合in查询赋值)。这两种赋值方法都需要传两参数:第一个参数是key值,对应HQL语句中的“:xxx”;第二个参数是value值,就对应key的实际值。这种传值比3-1-1更准确方便:一来不用担心下标错位的问题,二来如果存在”xx,xx,xx”这种格式的参数可以使用setParameterList方法,屡试不爽!3-2-1使用SQL“WHERE字段=?”的形式给参数赋值Java代码1.SQLQuerysql=baseDao.getSQL