当前位置:文档之家› hibernate查询数据库的三种方式

hibernate查询数据库的三种方式

Hibernate查询数据库的三种方式一、Hibernate的HQL与SQL查询1.Hql(Hibernate Query Language)是面向对象的查询查询方式,HQL查询提供了更加丰富的和灵活的查询特性,因此Hibernate将HQL查询方式立为官方推荐的标准查询方式,提供了类似标准SQL语句的查询方式,同时也提供了面向对象的封装。

HQL查询语句from关键字后面跟的类名+类对象,where后用对象的属性做条件;示例代码:(User是映射数据库的一个类)public boolean checkUser(UserForm userForm){//TODO Auto-generated method stub//String HQLString="from User u whereername='"+userForm.getUsername()+"'";String HQLString="from User u where ername=:uname";Session session=HibernateSessionFactory.currentSession();//获取事务session.beginTransaction();Query query=session.createQuery(HQLString);query.setParameter("uname",userForm.getUsername());//绑定参数Object list=query.list().get(0);//list获取数据集,get获取数据集的某条记录//提交事务session.getTransaction().commit();//关闭SessionHibernateSessionFactory.closeSession();User user=(User)list;if(user.getPassword().equals(userForm.getPassword())){return true;}else{return false;}}2.sql是面向数据库表查询,from后面跟的是表名,where后用表中字段做条件;示例代码:([xxdb].[dbo].[student]就是要查询的数据库表)public boolean checkUser(UserForm userForm){//TODO Auto-generated method stub//String SQLString="select*from[xxdb].[dbo].[student]u whereerName='"+userForm.getUsername()+"'";String SQLString=”select*from[xxdb].[dbo].[student]u whereerName=:uname”;Session session=HibernateSessionFactory.currentSession();session.beginTransaction();//Query query=session.createSQLQuery(SQLString).addEntity(User.class);//实体查询Query query=session.createSQLQuery(SQLString).addScalar("userid",StandardBasicTypes.INTEGER).addScalar("username",StandardBasicTypes.STRING).addScalar("password",StandardBasicTypes.STRING).addScalar("gender",StandardBasicTypes.INTEGER);//标量查询query.setParameter("uname",userForm.getUsername());//绑定参数Object list=query.list().get(0);//list获取数据集,get获取数据集的某条记录session.getTransaction().commit();HibernateSessionFactory.closeSession();User user=(User)list;if(user.getPassword().equals(userForm.getPassword())){return true;}else{return false;}}3.对比hql和sql查询方式我们可以发现他们之间的不同:a.首先是查询语句的不同,hql语句from后面跟的类名+类对象,where后用对象的属性做条件,而sql语句from后面跟的是表名,where后用表中字段做条件,这也就是面向对象和面向数据库的一个区别。

(上面例子中的User类映射的就是数据库中的[xxdb].[dbo].[student]表);b.创建查询对象的方法有所不同,hql是creatQuery,而sql是creatSQLQuery;c.Hql可以省略select关键字而sql不能省略。

4.hql和sql查询语句原则上都可以用拼接的方式书写查询条件,但为了为了防止SQL注入漏洞的产生一般用参数绑定的方式,参数绑定的方式有多种:按参数名称绑定query.setString(“uname”,“老谢”),按参数位置绑定query.setString(0,”laoxie”),setParameter()方法,setProperties()方法,setProperties方法命名参数与一个对象的属性值绑定在一起,如下程序代码:User user=new User();user.setUserName(“谢谢”);user.setGender(“1”);Query query=session.createQuery(from user u where ername=:name and u.gender=:gender);query.setProperties(user);setProperties()方法会自动将user对象实例的属性值匹配到命名参数上,但是要求命名参数名称必须要与实体对象相应的属性同名。

二、Hibernate条件查询使用Hibernate时,即使不了解SQL的使用与撰写,也可以使用它所提供的API来进行SQL语句查询,org.hibernate.Criteria对SQL进行封装,可以从Java物件的观点来组合各种查询条件,由Hibernate自动产生SQL语句,而不用特别管理SQL与数据库相依的问题。

Criteria criteria=session.createCriteria(User.class);List users=criteria.list();for(Iterator it=users.iterator();it.hasNext();){User user=(User)it.next();System.out.println(user.getId()+"/t"+user.getName()+"/"+user.getAge());}Criteria建立后,若不给予任何的条件,预设是查询物件所对应表格之所有记录,设定档中设定了Hibernate的”show_sql”属性,则可以在主控下看到以下的SQL语句之产生:Hibernate:select this_.id as id0_0_,this_.name as name0_0_,this_.age as age0_0_from T_USER this_;Criteria基本查询条件设定,使用org.hibernate.Criteria的add()方法加入这些条件实例,例如查询”age”大于20且小于40的资料:Criteria criteria=session.createCriteria(User.class);criteria.add(Restrictions.gt("age",new Integer(20)));criteria.add(Restrictions.lt("age",new Integer(40)));Restrictions的gt()方法表示大于(great than)的条件,而lt表示小于(less than)的条件;Restrictions的几个常用限定查询方法如下所示:方法说明Restrictions.eq等于Restrictions.allEq使用Map,使用key/value进行多个等于的比对Restrictions.gt大于>Restrictions.ge大于等于>=Restrictions.lt小于<Restrictions.le小于等于<=Restrictions.between对应SQL的BETWEEN子句Restrictions.like对应SQL的LIKE子句Restrictions.in对应SQL的in子句Restrictions.and and关系Restrictions.or or关系排序您可以使用Criteria进行查询,并使用org.hibernate.criterion.Order对结果进行排序,例如使用Oder.asc(),指定根据”age”由小到大排序(反之则使用desc()):Criteria criteria=session.createCriteria(User.class);criteria.addOrder(Order.asc("age"));限定查询记录数Criteria的setMaxResults()方法可以限定查询回来的记录数,如果配合setFirstResult()设定传回查询结果第一条记录的位置,就可以实现简单的分页,例如传回第51条之后的50条记录如果有的话):Criteria criteria=session.createCriteria(User.class);criteria.setFirstResult(51);criteria.setMaxResults(50);统计动作您可以对查询结果进行统计动作,使用org.hibernate.criterion.Projections的avg()、rowCount()、count()、max()、min()、countDistinct()等方法,再搭配Criteria的setProjection()方法加入条件设定,例如对查询结果的"age"作平均:Criteria criteria=session.createCriteria(User.class);criteria.setProjection(Projections.avg("age"));分组还可以配合Projections的groupProperty()来对结果进行分组,例如以"age"进行分组,也就是如果资料中"age"如果有20、20、25、30,则以下会显示20、25、30:Criteria criteria=session.createCriteria(User.class);criteria.setProjection(Projections.groupProperty("age"));List users=criteria.list();上面的程式将由Hibernate自动产生SQL的group by子句进行分组计算:Hibernate:select this_.age as y0_from T_USER this_group by this_.age结论Hibernate的Criteria API可以让你使用物件的方式,组合出查询数据库的条件,Hibernate会自动依你所使用的数据库,动态产生SQL语句,让你的应用程式在存取数据库时,不致于因撰写了特定的SQL而相依于特定的数据库,如果你不熟悉SQL语句的撰写,也可以试着使用Criteria来解决查询数据库的需求。

相关主题