QBC查询、离线条件查询(DetachedCriteric)和分页查询模版

一、QBC检索步骤

  QBC检索步骤:

  1.调用Session的createCriteria()方法创建一个Criteria对象。

  2.设定查询条件。Expression类提供了一系列用于设定查询条件的静态方法,

  这些静态方法都返回Criterion实例,每个Criterion实例代表一个查询条件。

  Criteria的add()方法用于加入查询条件。

  3.调用Criteria的list()方法执行查询语句。该方法返回List类型的查询结果,在

  List集合中存放了符合查询条件的持久化对象。

  • 比较运算符

  • HQL运算符 QBC运算符 含义
  • = Restrictions.eq() 等于
  • <> Restrictions.not(Exprission.eq()) 不等于
  • > Restrictions.gt() 大于
  • >= Restrictions.ge() 大于等于
  • < Restrictions.lt() 小于
  • <= Restrictions.le() 小于等于
  • 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() 等于列表中的某一个值
  • ont in(列表) Restrictions.not(Restrictions.in())不等于列表中任意一个值
  • between x and y Restrictions.between() 闭区间xy中的任意值
  • not between x and y Restrictions.not(Restrictions..between()) 小于值X或者大于值y

 

离线(detached)查询和子查询

DetachedCriteria类使你在一个session范围之外创建一个查询,并且可以使用任意的 Session来执行它。

DetachedCriteria query = DetachedCriteria.forClass(Cat.class)

.add( Property.forName("sex").eq('F') );

Session session = ....;

Transaction txn = session.beginTransaction();

List results = query.getExecutableCriteria(session).setMaxResults(100).list();

txn.commit();

session.close();

DetachedCriteria也可以用以表示子查询。条件实例包含子查询可以通过 Subqueries或者Property获得。

DetachedCriteria avgWeight = DetachedCriteria.forClass(Cat.class)

.setProjection( Property.forName("weight").avg() );

session.createCriteria(Cat.class)

.add( Property.forName("weight).gt(avgWeight) )

.list();

DetachedCriteria weights = DetachedCriteria.forClass(Cat.class)

.setProjection( Property.forName("weight") );

session.createCriteria(Cat.class)

.add( Subqueries.geAll("weight", weights) )

.list();

*************************************************

1. 创建一个Criteria 实例

org.hibernate.Criteria接口表示特定持久类的一个查询。Session是 Criteria实例的工厂。

Criteria crit = sess.createCriteria(Cat.class);

crit.setMaxResults(50);

List cats = crit.list();

 

2. 限制结果集内容

一个单独的查询条件是org.hibernate.criterion.Criterion 接口的一个实例。

org.hibernate.criterion.Restrictions类 定义了获得某些内置Criterion类型的工厂方法。

List cats = sess.createCriteria(Cat.class)   

.add( Restrictions.like("name", "Fritz%") )      相当于=》select * from car where name like 'Fritz%'

.add( Restrictions.between("weight", minWeight, maxWeight) )    

.list();   

约束可以按逻辑分组。

List cats = sess.createCriteria(Cat.class)

.add( Restrictions.like("name", "Fritz%") )

.add( Restrictions.or(

Restrictions.eq( "age", new Integer(0) ),

Restrictions.isNull("age")

) )

.list();

List cats = sess.createCriteria(Cat.class)

.add( Restrictions.in( "name", new String[] { "Fritz", "Izi", "Pk" } ) )

.add( Restrictions.disjunction()

.add( Restrictions.isNull("age") )

.add( Restrictions.eq("age", new Integer(0) ) )

.add( Restrictions.eq("age", new Integer(1) ) )

.add( Restrictions.eq("age", new Integer(2) ) )

) )

.list();

************************************************

可以使用注入sessionFactory,继承HibernateDaoSupport,获得hibernate模版进行相关操作

 

 

二、以分页查询为例

 

业务层

DetachedCriteric criteria=DetachedCriteric.forclass(Cat.class); //=>select *from cat;

添加条件约束

criteria.add(Restirctions.eq("flag","0"));  //select *from cat where flag='0';

1、查询总记录数

Long total= findCoundByDetachedCriteria(criteria);

2、查询相关信息

List<Cat> catinfo = findByCriteria(criteria);

持久层   (可作为持久层的模版一直使用)

查询总记录数

public Long findCoundByDetachedCriteria(DetachedCriteria criteria) {
        //设置投影 ,给criteria添加投影条件
        criteria.setProjection(Projections.rowCount());  //select count(*) from cat;
        List<Long> findByCriteria = this.getHibernateTemplate().findByCriteria(criteria);
        if(findByCriteria.size()<=0){
            return null;
        }
            return findByCriteria.get(0);
        
    }

//分页查询 select * from cat

public List<Cat> findByCriteria(DetachedCriteria criteria,
            int firstResult, int maxResult) {
       List<Standard> list = this.getHibernateTemplate().findByCriteria(criteria, firstResult, maxResult);
        if(list.size()<=0){
            return null;
        }
       return list;
    }

 

原文地址:https://www.cnblogs.com/fengjunming/p/7236973.html