HQL分析总结

来源:互联网 发布:网络教育怎么入学考试 编辑:程序博客网 时间:2024/05/22 02:14

HQL分析总结

HQL(Hibernate Query Language)

      面向对象的查询语言,于SQL不同,HQL中的对象名是区分大小写的(和属性其他部分不区分大小写);HQL中查的是对象而不是和表,并且HQL主要通过Query来操作,Query的创建方式:

Queryq=session.createQuery(hql);

1、实体查询

l      fromPerson

l      fromUser user where user.name=:name

l      fromUser user where user.name=:name and user.birthday<:birthday

l      fromUser user where user.age between 20 and 30;

l      fromUser user where user.age in (20,30);

l      fromUser user where user.name is null;

l      fromUser user where user.name like ’%zx%’;

l      fromUser user where (user.age%2)=1;

l      fromUser user where user.age=20 and user name like ‘%zx%’;

2、实体的更新和删除

这项技术功能是Hibernate3的新加入的功能,在Hibernate2重视不具备的。

Transactiontrans=session beginTransaction();

String hql=”updateUser user set user age=20 whereuser age=18”;

Queryqueryupdate=session.createQuery(hql);

Intret=queryupdate executeUpdate();

Trans commit();

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

Transactiontrans=session beginTransaction();

String hql=”deletefrom User user where user age=18”;

Queryqueryupdate=session createQuery(hql);

Intret=queryupdate executeUpdate();

Trans commit();

这种操作方式在Hibernate3中称为bulkdelete/update,这种方式能够在很大程度上提高操作的灵活性和运行效率,但是采用这种方式极有可能引起缓存同步上的问题。

3、属性查询

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

List list=sessioncreateQuery(“select user name from User user”);

List();

For(int i=0){

System.outprint(list get(i));

}

上面的代码质监所了User实体的name属性对应的数据,此时返回的包含结果集的list中每个条目都是String类型的name属性对应的数据。也可以以此检索多个属性:

List list=sessioncreateQuery(“select user name;user age from User user”);

List();

For(inti=0;i<list length();i++){

Object[]obj=(Object[])

List get(i);

System.out.println(obj[0]);

System.out.println(obj[1]);

}

此时返回的结果集list中,所包含的每个条目都是一个Object[]类型,其中包含对应的属性数据值。作为当今我们这一代深受面向对象思想影响的开发人员,可能会觉得上面返回Object[]不够符合面向对象风格,这时我们可以利用HQL提供的动态构造实例的功能对这些平面数据进行封装,如下面的程序代码:

  List list=session createQuery(“select newUser(user name,user age) from User user ”)

  list();

  for(int i=0;i<list length();i++){

  User user=(User)list get(i);

  System out println(user getName());

  System out println(user getAge());

  }

  这里我们通过动态构造实例对象,对返回结果进行了封装,使我们的程序更加符合面向对象风格,但是这里有一个问题必须注意,那就是这时所返回的User对象,仅仅只是一个普通的Java对象而以,除了查询结果值之外,其它的属性值都为null(包括主键值id),也就是说不能通过Session对象对此对象执行持久化的更新操作。如下面的代码:

  List list=session createQuery(“select newUser(user name,user age) from User user ”)

  list();

  for(int i=0;i<list length();i++){

  User user=(User)list get(i);

  user setName(“gam”);

  session saveOrUpdate(user);//这里将会实际执行一个save操作,而不会执行update操作,因为这个User对象的id属性为null,Hibernate会把它作为一个自由对象(请参考持久化对象状态部分的论述),因此会对它执行save操作。

  }

原创粉丝点击