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]);
}
查询一个属性和多个属性返回值有什么不同?

一个属性返回的是object对象集合

多个属性返回的是object对象数组集合


多个属性查询时可以利用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();

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’;由此可见
使用绑定参数会将用户名中输入的单引号解析成字符串。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值