云题海 - 专业文章范例文档资料分享平台

当前位置:首页 > HibernateHQL--实体、属性查询,全参数绑定,引用查询

HibernateHQL--实体、属性查询,全参数绑定,引用查询

  • 62 次阅读
  • 3 次下载
  • 2025/12/3 4:27:35

实用标准文案

是Hibernate官方推荐的查询模式,比Criteria功能更强大。

1) 实体查询:出现类名和属性名必须注意大小写区分;当不同路径下存在相同类名,需要

写入在hql中写入包名;查询目标实体存在着继承关系,将查询目标的所有子类的库表记录一起返回。

String hql = “from TUser”;

Query query = session.createQuery(hql); List list = query.list();

2) 属性查询:有时页面不需要取整个对象,而只取某个属性。

List list = session.createQuery(“select user.name user.age from TUser user”).list();

Iterator it = list.iterator(); while(it.hasNext()) {

//返回的list中,每个条目都是一个对象数组,依次包含我们所获取的数据。 Object[] results = (Object[])it.next(); System.out.println(results[0]);

System.out.println(results[1]); }

注:如果觉得返回数组的方式不够灵活,可以在HQL中构造对象实例。

List list = this.session.createQuery(“select new TUser(user.name,user.age) from TUser user”).list();

Iterator it = list.iterator(); while(it.hasNext()) {

TUser user = (TUser)it.next();

System.out.println(user.getName()); }

注:通过HQL动态构造对象实例,此时查询结果中的TUser对象只是一个Java对象,仅用于对查询结果的封装,除了在构造时赋予的属性值之外,其他属性均为未赋值状态,当我们通过session对此对象进行更新,将导致对user对象的数据库插入一条新数据,而不是更新原有对象。

我们也可以在HQL的select子句中使用统计函数(count(*),min(user.age))、SQL函数(upper(user.name))、distinct关键字。 1) 参数绑定

在HQL语句中直接写入where语句后面的条件值,不能满足参数为变量,如果参数设置变量,存在以下缺陷:a)编码凌乱,可读性降低;b)难以进行性能优化,JDBC以及数据库操作原理,每次执行SQL,数据库都将对SQL语法解析和优化,将处理结果保存在缓存中,以后参数不同语法相同的SQL命令直接以缓存结果加以执行,从而避免了SQL解析和优化的开销,如果传入具体值,根据值不同将视为两个SQL语句,无法利用缓存提高性能;c)引入额外的安全风险,where name=’”+username+”’ and password=’”+password+”’”;在登录网页上输入用户名:“Eric ’or‘ x ’=’ x”密码随意,根据输入拼装的HQL语句是where name=’Cartier’ or ‘x’=’x’ and password=’arbitrary’,由于被添加进了or ‘x’=’x,所以系统登录成功。这就是SQL Injection攻击的基本原理。

Hibernate 参数绑定

精彩文档

实用标准文案

//Session.find方法中填充参数

session.find(“from TUser where name=?”,”Erica”,Hibernate.STRING); //多参数情况

Object[] args = new Object[]{“Erica”,new Integer(20)};

Type[] types = new Type[]{Hibernate.STRING,Hibernate.INTEGER}; session.find(“from TUser where name=? and age>?”,args,types); //引用占位符

String hql = “from TUser where name=:name”; Query query = session.createQuery(hql); query.setParameter(“name”,”Erica”); Iterator it = query.list().iterator(); while(it.hasNext()) {

TUser user = (TUser)it.next();

System.out.println(user.getName()); } 注:“:name”就是引用占位符,标识一个名为“name”的查询参数,setParameter对参数进行填充。

//用JavaBean封装查询参数 class UserQuery{

private String name; private Integer age; ………getter/setter }

String hql =” from TUser where name=:name and age=:age”; Query query = session.createQuery(hql); UserQuery uq = new UserQuery(); uq.setName(“Erica”);

uq.setAge(new Integer(20)); query.setProperties(uq);

Iterator it = query.iterate(); while(it.hasNext()) {

TUser user = (TUser)it.next();

System.out.println(user.getName()); }

引用查询:有些代码不允许写sql语句,防止破坏代码可读性。避免这种情况,采取将SQL配置化的方式,即将SQL保存在配置文件中,需要调用的时候在进行读取。Hibernate提供了HQL可配置化的内置支持。可以在实体映射文件里,与class节点同级,定义查询语句:

Query query = session.getNameQuery(“queryByName”); UserQuery uq = new UserQuery();

精彩文档

实用标准文案

uq.setName(“Erica”); query.setProperties(uq);

Iterator it = query.iterate(); while(it.hasNext()) {

TUser user = (TUser)it.next();

System.out.println(user.getName()); }

Hibernate:HQL语句讲解及用法实例

近来项目里的数据访问层使用到了OR Mapping技术,为了缩短项目开发周期和成本,项目经理采取了现有的流行的Hibernate.在这里,为了给广大的Hibernate或 NHibernate的使用者提供学习查阅方便,特整理HQL语句教程部分,希望能够给你带来帮助. HQL查询:

Criteria查询对查询条件进行了面向对象封装,符合编程人员的思维方式,不过HQL(Hibernate Query Lanaguage)查询提供了更加丰富的和灵活的查询特性,因此Hibernate将HQL查询方式立为官方推荐的标准查询方式,HQL查询在涵盖 Criteria查询的所有功能的前提下,提供了类似标准SQL语句的查询方式,同时也提供了更加面向对象的封装。完整的HQL语句形势如下:

Select/update/delete…… from …… where …… group by …… having …… order by …… asc/desc

其中的update/delete为Hibernate3中所新添加的功能,可见HQL查询非常类似于标准SQL查询。由于HQL查询在整个Hibernate实体操作体系中的核心地位,这一节我将专门围绕HQL操作的具体技术细节进行讲解。 1、 实体的更新和删除:

在继续讲解HQL其他更为强大的查询功能前,我们先来讲解以下利用HQL进行实体更新和删除的技术。这项技术功能是Hibernate3的新加入的功能, 在Hibernate2中是不具备的。比如在Hibernate2中,如果我们想将数据库中所有18岁的用户的年龄全部改为20岁,那么我们要首先将年龄 在18岁的用户检索出来,然后将他们的年龄修改为20岁,最后调用Session.update()语句进行更新。在Hibernate3中对这个问题提 供了更加灵活和更具效率的解决办法,如下面的代码:

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();

通过这种方式我们可以在Hibernate3中,一次性完成批量数据的更新,对性能的提高是相当的可观。同样也可以通过类似的方式来完成delete操作,如下面的代码:

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();

如果你是逐个章节阅读的化,那么你一定会记起我在第二部分中有关批量数据操作的相关论述中,讨论过这种操作方式,这种操作方式在Hibernate3中称 为 bulk delete/update,这种方式能够在很大程度上提高操作的灵活性和运行效率,但是采用这种方式极有可能引起缓存同步上的问题(请参考相关论述)。 2、实体查询:

有关实体查询技术,其实我们在先前已经有多次涉及,比如下面的例子: String hql=”from User user ”;

List list=session.CreateQuery(hql).list();

上面的代码执行结果是,查询出User实体对象所对应的所有数据,而且将数据封装成User实体对象,并且放入List中返回。这里需要注意的是, Hibernate的实体查询存在着对继承关系的判定,比如我们前面讨论映射实体继承关系中的Employee实体对象,它有两个子类分别是 HourlyEmployee,SalariedEmployee,如果有这样的HQL语句:“from Employee”,当执行检索时Hibernate会检索出所有Employee类型实体对象所对应的数据(包括它的子类 HourlyEmployee,SalariedEmployee对应的数据)。

因为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 ‘%zx%’; from User user where (user.age%2)=1;

from User user where user.age=20 and user.name like ‘%zx%’;

3、 属性查询:

很多时候我们在检索数据时,并不需要获得实体对象所对应的全部数据,而只需要检索实体对象的部分属性所对应的数据。这时候就可以利用HQL属性查询技术,如下面程序示例:

List list=session.createQuery(“select user.name from User user ”).list(); for(int i=0;i

System.out.println(list.get(i)); }

我们只检索了User实体的name属性对应的数据,此时返回的包含结果集的list中每个条目都是String类型的name属性对应的数据。我们也可以一次检索多个属性,如下面程序:

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]);

精彩文档

  • 收藏
  • 违规举报
  • 版权认领
下载文档10.00 元 加入VIP免费下载
推荐下载
本文作者:...

共分享92篇相关文档

文档简介:

实用标准文案 是Hibernate官方推荐的查询模式,比Criteria功能更强大。 1) 实体查询:出现类名和属性名必须注意大小写区分;当不同路径下存在相同类名,需要写入在hql中写入包名;查询目标实体存在着继承关系,将查询目标的所有子类的库表记录一起返回。 String hql = “from TUser”; Query query = session.createQuery(hql); List list = query.list(); 2) 属性查询:有时页面不需要取整个对象,而只取某个属性。 List list = session.createQuery(“select user.name user.age from TUser user”).list(); I

× 游客快捷下载通道(下载后可以自由复制和排版)
单篇付费下载
限时特价:10 元/份 原价:20元
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150
全站内容免费自由复制
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150
全站内容免费自由复制
注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信:fanwen365 QQ:370150219
Copyright © 云题海 All Rights Reserved. 苏ICP备16052595号-3 网站地图 客服QQ:370150219 邮箱:370150219@qq.com