Hibernate HQL查询


HQL查询: 完整的 HQL 语句形势如下: Select/update/delete…… from …… where …… group by …… having …… order by …… asc/desc 其中的 update/delete 为Hibernate3 中所新添加的功能 1、 实体的更新和删除: 更新 Transaction trans=session.beginTransaction(); String hql=”update User user set user.age=20 where user.age=18”; Query queryupdate=session.createQuery(hql); int ret=queryupdate.executeUpdate(); trans.commit(); 删除 Transaction trans=session.beginTransaction(); String hql=”delete from User user where user.age=18”; Query queryupdate=session.createQuery(hql); int ret=queryupdate.executeUpdate(); trans.commit(); 优点:一次性完成批量数据的更新,对性能的提高是相当的可观 缺点:极有可能引起缓存同步上的问题 2、实体查询: String hql=”from User user ”; List list=session.CreateQuery(hql).list(); 查询结果的返回值和查询原理(继承关系) 因为 HQL 语句与标准 SQL 语句相似,所以我们也可以在 HQL 语句中使用 where 字句,并且可 以在 where 字句中使用各种表达式,比较操作符以及使用“and”,”or”连接不同的查询条 件的组合。看下面的一些简单的例子: from User user where user.age=20; from User user where user.age between 20 and 30; from User user where user.age in(20,30); from User user where user.name is null; from User user where user.name like ‘%feng%’; from User user where (user.age%2)=1; from User user where user.age=20 and user.name like ‘%feng%’; 3、 属性查询: 查询一个属性 List list=session.createQuery(“select user.name from User user ”).list(); for(int i=0;i System.out.println(list.get(i)); } 查询多个属性 List list=session.createQuery(“select user.name,user.age from User user ”).list(); for(int i=0;i Object[] obj=(Object[])list.get(i); System.out.println(obj[0]); System.out.println(obj[1]); } 查询一个属性和多个属性返回值有什么不同。 多个属性查询时可以利用 HQL 提供的动态构造实例的功能 List list=session.createQuery(“select new User(user.name,user.age) from User user ”).list(); for(int i=0;i User user=(User)list.get(i); System.out.println(user.getName()); System.out.println(user.getAge()); } 注意:这个 User 只是一个 JAVA 对象。不能看作为持久化对象。这个对象只有查询的属性才 有值。其它的属性都没值,包括 ID。 List list=session.createQuery(“select new User(user.name,user.age) from User user ”).list(); for(int i=0;i User user=(User)list.get(i); user.setName(“gam”); session.saveOrUpdate(user); //? 4、 分组与排序 A、Order by 子句: 与SQL 语句相似,HQL 查询也可以通过 order by 子句对查询结果集进行排序,并且可以通 过asc 或者 desc 关键字指定排序方式,如下面的代码: from User user order by user.name asc,user.age desc; B、Group by 子句与统计查询: 在HQL 语句中同样支持使用 group by 子句分组查询,还支持 group by 子句结合聚集函数的 分组统计查询,大部分标准的 SQL 聚集函数都可以在 HQL 语句中使用,比如: count(),sum(),max(),min(),avg()等。如下面的程序代码: String hql=”select count(user),user.age from User user group by user.age having count(user)>10 ”; List list=session.createQuery(hql).list(); C、优化统计查询: 假设我们现在有两张数据库表,分别是 customer 表和 order 表,它们的结构如下: customer ID varchar2(14) age number(10) name varchar2(20) order ID varchar2(14) order_number number(10) customer_ID varchar2(14) 现在有两条 HQL 查询语句,分别如下: from Customer c inner join c.orders o group by c.age;(1) select c.ID,c.name,c.age,o.ID,o.order_number,o.customer_ID from Customer c inner join c.orders c group by c.age;(2) 比较两个语句:在 MIS 系统中 从缓存方面和返回值、同步数据库 5、 参数绑定: PrepareStatement pre=connection.prepare(“select * from User where user.name=?”); pre.setString(1,”zhaoxin”); ResultSet rs=pre.executeQuery(); 在Hibernate 中共存在 4种参数绑定的方式,下面我们将分别介绍: A、 按参数名称绑定: 在HQL 语句中定义命名参数要用”:”开头,形式如下: Query query=session.createQuery(“from User user where user.name=:customername and user:customerage=:age ”); query.setString(“customername”,name); query.setInteger(“customerage”,age); B、 按参数位置邦定: 在HQL 查询语句中用”?”来定义参数位置,形式如下: Query query=session.createQuery(“from User user where user.name=? and user.age =? ”); query.setString(0,name); query.setInteger(1,age); 注:在实际开发中,提倡使用按名称邦定命名参数,因为这不但可以提供非常好的程序可读 性,而且也提高了程序的易维护性,因为当查询参数的位置发生改变时,按名称邦定名参数 的方式中是不需要调整程序代码的。 C、 setParameter()方法: 在Hibernate 的HQL查询中可以通过 setParameter()方法邦定任意类型的参数,如下代码: String hql=”from User user where user.name=:customername ”; Query query=session.createQuery(hql); query.setParameter(“customername”,name,Hibernate.STRING); //hibernate.data or timestamp D、 setProperties()方法: 在Hibernate 中可以使用 setProperties()方法,将命名参数与一个对象的属性值绑定在一起, 如下程序代码: Customer customer=new Customer(); customer.setName(“pansl”); customer.setAge(80); Query query=session.createQuery(“from Customer c where c.name=:name and c.age=:age ”); query.setProperties(customer); 注意:属性名字与参数名一样。 E、 使用绑定参数的优势: ①、 可以利用数据库实施性能优化,因为对 Hibernate 来说在底层使用的是 PrepareStatement 来完成查询,因此对于语法相同参数不同的 SQL 语句,可以充分利用预编译 SQL 语句缓存 , 从而提升查询效率。 ②、 可以防止 SQL Injection(SQL 语句拼装的攻击方式)安全漏洞的产生 例子: 在登录界面上,用户输入用户名和口令,这时登录验证程序可能会生成如下的 HQL语 句 : “from User user where user.name=’”+name+”’ and user.password=’”+password+”’” 这个 HQL语句从逻辑上来说是没有任何问题的,这个登录验证功能在一般情况下也是会正 确完成的,但是如果在登录时在用户名中输入”zhaoxin or ‘1’=’1”,这时如果使用简单的 HQL 语句的字符串拼装,就会生成如下的 HQL语句: “from User user where user.name=’zhaoxin’ or ‘1’=’1’ and user.password=’admin’”; 显然这条 HQL语句的 where 字句将会永远为真,而使用户口令的作用失去意义。 而使用绑定参数方式,就可以妥善处理这问题,当使用绑定参数时,会得到下面的 HQL语句 : from User user where user.name=’’zhaoxin’’ or ‘’1=’’1’’‘ and user.password=’admin’;由此可见 使用绑定参数会将用户名中输入的单引号解析成字符串。
还剩3页未读

继续阅读

下载pdf到电脑,查找使用更方便

pdf的实际排版效果,会与网站的显示效果略有不同!!

需要 15 金币 [ 分享pdf获得金币 ] 0 人已下载

下载pdf

pdf贡献者

together

贡献于2011-05-31

下载需要 15 金币 [金币充值 ]
亲,您也可以通过 分享原创pdf 来获得金币奖励!
下载pdf