HQL查询的相关知识
2009-08-06 22:43
302 查看
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’;由此可见
使用绑定参数会将用户名中输入的单引号解析成字符串。
完整的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’;由此可见
使用绑定参数会将用户名中输入的单引号解析成字符串。
相关文章推荐
- hibernate简单事例,注意事项,保存,更新,删除,session,Query,Criteria查询_Hql与Criteria查询的补充知识
- HQL查询相关
- Oracle字符集相关知识(查询,修改,dmp字符集)
- SQL相关知识复习,比较难的几个查询
- linux操作系统知识分享(进程简介,SSH使用原理图,配置环境变量,系统基本信息查询,系统管理,war包部署相关命令)
- mysql查询相关知识
- 自己没有记住的一点小知识(ORM查询相关)
- hive的数据查询的相关语法知识
- Hibernate查询相关知识
- oracle字符集相关知识(查询,修改,dmp字符集)
- HQL相关知识
- 关于并行查询调优涉及的相关知识[收集中]
- 52.Hibernate Hql与Criteria查询的补充知识
- solr查询q的相关知识
- Hibernate Hql与Criteria查询的补充知识
- 【知识整理】Hibernate-HQL查询之分页查询、投影查询、报表查询
- 【Hibernate步步为营】--hql查询过滤器及相关聚合函数查询详解
- 52.Hibernate Hql与Criteria查询的补充知识
- dubbo相关知识(六)-- java RMI框架
- HeapSort堆排序C++实现及相关背景知识