hibernate的多条件查询——Criteria Query的应用

 

查询数据时,人们往往需要设置查询条件。在SQL或HQL语句中,查询条件常常放在where子句中。此外,Hibernate还支持Criteria查询(Criteria Query),这种查询方式把查询条件封装为一个Criteria对象。在实际应用中,使用Session的createCriteria()方法构建一个org.hibernate.Criteria实例,然后把具体的查询条件通过Criteria的add()方法加入到Criteria实例中。这样,程序员可以不使用SQL甚至HQL的情况下进行数据查询。

 

先看一个简单的例子:

Criteria cr = session.createCriteria(Student.class); //生成一个Criteria对象
cr.add(Restrictions.eq("name""xy"));            //等价于where name=’xy’
List list = cr.list();

 

我们来看运算符这样一个对比。

 

 

HQL运算符

QBC运算符

含义

=

Restrictions.eq()

等于equal

<> 

Restrictions.ne()

不等于not equal

Restrictions.gt()

大于greater than

>=

Restrictions.ge()

大于等于greater than or equal

Restrictions.lt()

小于less than

<=

Restrictions.le()

小于等于less than or equal

is null

Restrictions.isnull()

等于空值

is not null

Restrictions.isNotNull()

非空值

like

Restrictions.like()

字符串模式匹配

and

Restrictions.and()

逻辑与

and

Restrictions.conjunction()

逻辑与

or

Restrictions.or()

逻辑或

or

Restrictions.disjunction()

逻辑或

not

Restrictions.not()

逻辑非

in(列表)

Restrictions.in()

等于列表中的某一个值

not in(列表)

Restrictions.not(Restrictions.in())

不等于列表中任意一个值

between x and y

Restrictions.between()

闭区间xy中的任意值

not between x and y

Restrictions.not(Restrictions..between())

小于值X或者大于值y

 

 

Criteria什么时候威力最大呢?就是多条件查询的时候。

 

视图是这样:

学号<input type="text" name="dto.num" />
姓名<input type="text" name="dto.name" />
<input type="submit" value="查询" />

 

hibernate的多条件查询——Criteria Query的应用

 

我们可以这样做:

 

Entity层

public class Student

{

    private int id;

    private String name;

    private Date birth;

    ...........

 

DTO层

public class StudentDto
{
 private int id;     // 学生编号
 private String name;// 学生姓名

 public int getId()
 {
  return id;
 }

 public void setId(int id)
 {
  this.id = id;
 }

 public String getName()
 {
  return name;
 }

 public void setName(String name)
 {
  this.name = name;
 }

}

 

Impl层

public PageModel getQqueryResult(StudentDto dto, int start, int pagesize)
 {
  Criteria c = this.getSession().createCriteria(Student.class);
  if (0 != dto.getId())
  {
   c.add(Restrictions.like("id", dto.getId()));
  }

  if (null != dto.getName() && !"".equals(dto.getName()))
  {
   c.add(Restrictions.like("xm", "%" + dto.getName() + "%"));
  }

  int count = c.list().size();
  List datas = c.setFirstResult(start).setMaxResults(pagesize).list();
  int totalPage = helper.totalPage(count, pagesize);

 

  // 得到结果集
  PageModel pm = new PageModel();
  pm.setTotal(count);
  pm.setDatas(datas);
  pm.setTotalPage(totalPage);
  return pm;
 }


.......下面就涉及到Struts和SSH分页的知识了,在这里就不多赘述了。^ ^

 

 

 

 参考地址:http://blog.csdn.net/dengqf/article/details/6603531

上一篇:.NET MD5加密解密代码


下一篇:多年困扰我的一个技术问题,希望这方面的专家指点一下,有关SQLServer并发控制方面的问题