首页  ·  知识 ·  编程语言
Hibernate的Criteria的用法
网友  中国IT实验室   Java  编辑:德仔   图片来源:网络
复合查询主要是处理,具有关联关系的两个实体怎样进行关联查询,比如User实体对象与Addres实体对象具有一对多的关联关系,我们可以如
复合查询主要是处理,具有关联关系的两个实体怎样进行关联查询,比如User实体对象与Addres实体对象具有一对多的关联关系,我们可以如下构造符合查询:

  Criteria criteria=session.createCriteria(User.class);

  Criteria addcriteria=criteria.createCriteria(“addresses”);(1)

  addcriteria.add(Express.like(“address”,”%tianjin%”));

  List list=criteria.list();

  for(int i=0;i

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

  System.out.println(user.getName()+”\n”);

  Set addresses=user.getAddresses();

  Iterator it=addresses.iterator();

  while(it.hasNext(){

  Address address=(Address)it.next();

  System.out.println(address.getAddress()+”\n”);

  }

  }

  当执行到了(1)处时,表明要针对User对象的addresses属性添加新的查询条件,因此当执行criteria.list()时,Hibernate会生成类似如下的SQL语句:

  Select * from user inner join address on user.id=address.id where address.address like ‘%shanghai%’;

  正如我们所见,我们可以通过向Criteria中添加保存关联对象的集合属性(addresses属性保存与User对象相关联的Address对象),来构造复合查询,在数据库一端是通过内连接查询来实现。

  Hibernate QBC查询

  QBC查询:

  QBC查询就是通过使用Hibernate提供的Query By Criteria API来查询对象,这种API封装了SQL语句的动态拼装,对查询提供了更加面向对象的功能接口。我们看下面的示例程序:

  Criteria criteria=session.createCriteria(User.class);

  criteria.add(Expression.eq(“name”,”zx”));

  criteria.add(Expression.eq(“age”,new Integer(27));

  List list=criteria.list();

  当执行criteria.list()时会生成类似这样的SQL语句:Select * from user where name=’zx’ and age=27;所以在这里我们可以看出,Criteria实际上是一个查询容器,它对查询条件表达式的添加进行了封装,具体的查询条件是通过add()方法添加的,而且具体的查询条件的表达式运算是通过Expression指定的。Hibernate在运行期会根据Criteria指定的表达式条件来添加查询条件,并且生成查询语句。这种方式非常符合Java以及所有面向对象编程语言的编程方式,所以大多数的持久层框架都提供了对这种方式查询的支持。下面我们讲解这种查询方式的各个技术细节。

  1、Criteria查询表达式:

  正如我们所见,Expression对查询语句的表达式进行了封装和限制,下表列出了Expression所有的方法,以及每个方法所对应的查询表达式及其限制。

 

方法
描述
Expression.eq
对应SQL的“field=value”表达式
如:Expression.eq(“name”,”zx”);
Expression.allEq
方法的参数为一个Map类型对象,包含多个名/值对对应关系,相当于多个Expression.eq的叠加
Expression.gt
对应SQL的“field>value”表达式
Expression.ge
对应SQL的“field>=value”表达式
Expression.lt
对应SQL的“field”表达式
Expression.le
对应SQL的“field<=value”表达式
Expression.between
对应SQL语句的between表达式,如:查询年龄在2127岁之间的用户,可以写成Expression.between(“age”,new Integer(21),new Integer(27));
Expression.like
对应SQL语句的”field like value”表达式
Expression.in
对应SQL语句的“field in(……)”表达式
Expression.eqProperty
用于比较两个属性值,对应”field=field”SQL表达式
Expression.gtProperty
用于比较两个属性值,对应”field>field”SQL表达式
Expression.geProperty
用于比较两个属性值,对应”field>=field”SQL表达式
Expression.ltProperty
用于比较两个属性值,对应”field表达式
Expression.leProperty
用于比较两个属性值,对应”field<=field”SQL表达式
Expression.and
对应SQL语句的And关系组合,如:Expression.and(Expression.eq(“name”,”zx”),Expression.eq(“sex”,”1”));
Expression.or
对应SQL语句的Or关系组合,如:Expression.or(Expression.eq(“name”,”zx”),Expression.eq(“name”,”zhaoxin”));
Expression.sql
作为补充这个方法提供了原生SQL语句查询的支持,在执行时直接通过原生SQL语句进行限定,如:Expression.sql(“lower({alias}.name) like (?)”,“zhao%”,Hibernate.STRING) ;在运行时{ alias }将会由当前查询所关联的实体类名替换,()中的?将会由”zhao%”替换,并且类型由Hibernate.STRING指定。

 

  注意:Expression各方法中的属性参数(各方法中的第一个参数)所指定的属性名称(如:name,sex),并不是数据库表中的实际字段名称,而是实体对象中映射实际数据表字段的类属性名称。2、示例查询:

  示例查询是通过Example类来完成的,Example类实现了Criterion接口,可以用作Criteria查询条件,Example类的作用是:根据已有对象,查询属性值与之相同的其他对象。如下代码所示:

  Criteria criteria=session.createCriteria(User.class);

  User exampleuser=new User(“zx”);

  criteria.add(Example.create(exampleuser));

  List list=criteria.list();

  for(int i=0;i

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

  System.out.println(user.getName()+”\n”);

  }

  上述代码中User exampleuser=new User(“zx”);criteria.add(Example.create(exampleuser));两句相当于

  criteria.add(Expression.eq(“name”,”zx”));因此会生成类似如下的SQL语句:

  select * from user where name=’zx’;在上面的代码中exampleuser称为示例对象。

  在Hibernate中队示例查询,默认情况下会排除掉示例对象中属性值为空的属性,还可以调用Example.excludeNone(排除空串值)/excludeZeros(排除零值),或者调用Example.excludeProperty方法来指定排除特定属性。

  示例查询主要应用于组合查询中,比如根据用户输入的查询条件动态生成最终的查询语句,通过使用示例查询,可以避免由于查询条件过多而写的大量if判断语句。

  3、复合查询:

  复合查询主要是处理,具有关联关系的两个实体怎样进行关联查询,比如User实体对象与Addres实体对象具有一对多的关联关系,我们可以如下构造符合查询:

  Criteria criteria=session.createCriteria(User.class);

  Criteria addcriteria=criteria.createCriteria(“addresses”);(1)

  addcriteria.add(Express.like(“address”,”%tianjin%”));

  List list=criteria.list();

  for(int i=0;i

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

  System.out.println(user.getName()+”\n”);

  Set addresses=user.getAddresses();

  Iterator it=addresses.iterator();

  while(it.hasNext(){

  Address address=(Address)it.next();

  System.out.println(address.getAddress()+”\n”);

  }

  }

  当执行到了(1)处时,表明要针对User对象的addresses属性添加新的查询条件,因此当执行criteria.list()时,Hibernate会生成类似如下的SQL语句:

  Select * from user inner join address on user.id=address.id where address.address like ‘%shanghai%’;

  正如我们所见,我们可以通过向Criteria中添加保存关联对象的集合属性(addresses属性保存与User对象相关联的Address对象),来构造复合查询,在数据库一端是通过内连接查询来实现。

  4、Criteria的高级特性:

  A、限定返回记录条数:

  我们可以通过利用Criteria.setFirstResult/setMaxResult方法来限定返回某一次查询的记录数,如下代码:

  Criteria criteria=session.createCriteria(User.class);

  criteria.setFirstResult(100);

  criteria.setMaxResult(200);

  通过以上代码可以设定该次查询返回user表中的从第100条记录开始直到第200条记录结束的100条记录。

  B、对查询结果进行排序:

  可通过使用net.sf.hibernate.expression.Order类可以对查询结果集进行排序,如下面代码:

  Criteria criteria=session.createCriteria(User.class);

  criteria.add(Expression.eq(“groupid”,”2”);

  criteria.addOrder(Order.asc(“name”));

  criteria.addOrder(Order.desc(“groupid”));

  List list=criteria.list();

  通过使用Order类的asc()/desc()方法,可以指定针对某个字段的排序逻辑,如果执行上述代码,会生成类似如下的SQL语句:

  Select * from user where groupid=’2’ order by name asc,groupid desc

本文作者:网友 来源:中国IT实验室
CIO之家 www.ciozj.com 微信公众号:imciow
   
免责声明:本站转载此文章旨在分享信息,不代表对其内容的完全认同。文章来源已尽可能注明,若涉及版权问题,请及时与我们联系,我们将积极配合处理。同时,我们无法对文章内容的真实性、准确性及完整性进行完全保证,对于因文章内容而产生的任何后果,本账号不承担法律责任。转载仅出于传播目的,读者应自行对内容进行核实与判断。请谨慎参考文章信息,一切责任由读者自行承担。
延伸阅读