Hibernate之Criteria基本查询

开发 后端
本文介绍Hibernate中的Criteria基本查询。使用Hibernate时,即使您不了解SQL的使用与撰写,也可以使用它所提供的API来进行SQL语句查询,org.hibernate.Criteria对SQL进行封装。

要对资料库管理系统进行操作,最基本的就是使用SQL(Standard Query Language)语句,大部份的资料库都支援标准的SQL语句,然而也有一些特定于资料库的SQL语句,应用程式配合SQL语句进行资料库查询时,若使用到特定于资料库的SQL语句,程式本身会有相依于特定资料库的问题。

使用Hibernate时,即使您不了解SQL的使用与撰写,也可以使用它所提供的API来进行SQL语句查询, org.hibernate.Criteria对SQL进行封装,您可以从Java物件的观点来组合各种查询条件,由Hibernate自动为您产生 SQL语句,而不用特别管理SQL与资料库相依的问题,就某个程度的意涵来看,这就像是在编译时期也可以得到对SQL语法的检查与验证。

以最基本的Criteria基本查询来说,如果您想要查询某个物件所对应的资料表中所有的内容,您可以如下进行查询:

  1. Criteria criteria = session.createCriteria(User.class);  
  2. List users = criteria.list();  
  3.           
  4. for(Iterator it = users.iterator(); it.hasNext(); ) {  
  5.     User user = (User) it.next();  
  6.     System.out.println(user.getId() +  
  7.                              " \t " + user.getName() +  
  8.                           "/" + user.getAge());      

Criteria建立后,若不给予任何的条件,预设是查询物件所对应表格之所有资料,如果您执行以上的程式片段,并于设定档中设定了了Hibernate的”show_sql”属性,则可以在主控下看到以下的SQL语句之产生:

Hibernate: select this_.id as id0_0_, this_.name as name0_0_, this_.age as age0_0_ from T_USER this_

org.hibernate.Criteria实际上是个条件附加的容器,如果想要设定查询条件,则要使用 org.hibernate.criterion.Restrictions的各种静态方法传回 org.hibernate.criterion.Criteria实例,传回的每个org.hibernate.criterion.Criteria 实例代表着一个条件,您要使用org.hibernate.Criteria的add()方法加入这些条件实例,例如查询” age”大于20且小于40的资料:

  1. Criteria criteria = session.createCriteria(User.class);  
  2. criteria.add(Restrictions.gt("age"new Integer(20)));  
  3. criteria.add(Restrictions.lt("age"new Integer(40)));  
  4. List users = criteria.list();  
  5.           
  6. for(Iterator it = users.iterator(); it.hasNext(); ) {  
  7.     User user = (User) it.next();  
  8.     System.out.println(user.getId() +  
  9.                               " \t " + user.getName() +  
  10.                              "/" + user.getAge());      

Restrictions的gt()方法表示大于(great than)的条件,而lt表示小于(less than)的条件,执行以上程式片段,观察所产生的SQL语句,将使用where与and子句产来完成SQL的条件查询:

Hibernate: select this_.id as id0_0_, this_.name as name0_0_, this_.age as age0_0_ from T_USER this_ where this_.age>? and this_.age< ?

使用add()方法加入条件时,预设是使用and来组合条件,如果要用or的方式来组合条件,则可以使用Restrictions.or()方法,例如结合age等于(eq)20或(or)age为空(isNull)的条件:

  1. Criteria criteria = session.createCriteria(User.class);  
  2. criteria.add(Restrictions.or(  
  3.                    Restrictions.eq("age"new Integer(20)),  
  4.                    Restrictions.isNull("age")  
  5.                ));  
  6. List users = criteria.list(); 

观察所产生的SQL语句,将使用where与or子句完成SQL的条件查询:

Hibernate: select this_.id as id0_0_, this_.name as name0_0_, this_.age as age0_0_ from T_USER this_ where (this_.age=? or this_.age is null)

您也可以使用Restrictions.like()方法来进行SQL中like子句的功能,例如查询”name”中名称为”just”开头的资料:

  1. Criteria criteria = session.createCriteria(User.class);  
  2. criteria.add(Restrictions.like("name""just%"));  
  3. List users = criteria.list(); 

观察所产生的SQL语句如下:

Hibernate: select this_.id as id0_0_, this_.name as name0_0_, this_.age as age0_0_ from T_USER this_ where this_.name like ?

Restrictions的几个常用限定查询方法如下表所示:

方法 说明
Restrictions.eq 等于
Restrictions.allEq 使用Map,使用key/value进行多个等于的比对
Restrictions.gt 大于 >
Restrictions.ge 大于等于 >=
Restrictions.lt 小于 <
Restrictions.le 小于等于 < =
Restrictions.between 对应SQL的BETWEEN子句
Restrictions.like 对应SQL的LIKE子句
Restrictions.in 对应SQL的in子句
Restrictions.and and关系
Restrictions.or or关系
Restrictions.sqlRestriction SQL限定查询

Criteria基本查询差不多就是这样。

【编辑推荐】

  1. Hibernate缓存简介及分类
  2. Hibernate中generator属性的意义
  3. hibernate Key Generator 主键生成方式
  4. Hibernate的主键生成机制
  5. Hibernate的事务:事务对象的方法
责任编辑:book05 来源: 百度博客
相关推荐

2009-06-30 16:46:45

Criteria进阶查

2009-06-30 16:55:19

2009-06-17 14:17:40

Criteria条件查Hibernate

2009-09-28 12:57:54

Hibernate C

2009-09-24 13:03:38

Hibernate C

2009-06-18 10:07:03

CriteriaHibernate

2009-06-26 16:15:04

Criteria的用法Hibernate

2009-06-08 10:20:01

Hibernate查询

2009-06-18 12:59:39

Criteria Qu深入浅出Hiberna

2009-06-30 16:57:21

Criteria查询

2009-11-13 09:24:58

JPA 2.0Criteria AP

2016-12-15 08:38:50

1 Hibernate基本配置

2009-06-12 15:13:12

Hibernate学习

2009-09-29 16:29:40

Hibernate查询

2009-09-27 10:19:11

Hibernate命名

2009-06-18 09:47:50

2009-09-22 08:39:59

Hibernate F

2009-06-17 08:47:00

Hibernate优化

2009-06-18 09:14:08

Hibernate H

2009-09-24 15:27:41

Hibernate查询
点赞
收藏

51CTO技术栈公众号