🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
[TOC] # QBC(query by criteria) QBC(query by criteria),它是一种更加面向对象的检索方式。 org.hibernate.criterion.Criterion是Hibernate提供的一个面向对象查询条件接口.一个单独查询就是Criterion接口的一个实例,用于限制Criteria对象的查询,在Hibernate中Criterion对象的创建通常是通过Restrictions工厂类完成的 具体如下: 1. 获得 Hibernate的 Session对象。 2. 通过 Session获得 Criteria对象。 3. 使用 Restrictions的静态方法创建 Criterion条件对象。 Restrictions类中提供了一系列用于 设定查询条件的静态方法,这些静态方法都返回 Criterion实例,每个 Criterion实例代表 个查询条件。 4. 向 Criteria对象中添加 Criterion查询条件。 Criteria的add()方法用于加入查询条件 5. 执行 Criteria的list()或uniqueresult()获得结果 Criteria接口与Query接口非常类似,允许创建并执行面向对象的标准化查询。值得注意的是Criteria接口也是轻量级的,它不能在Session之外使用。 ## 基本检索 ~~~ //1. 得到一个Criteria对象 Criteria criteria = session.createCriteria(Goods.class); //2. 调用list方法 List<Goods> list = criteria.list(); System.out.println(list); ~~~ ## 排序检索 **注意在criteri.addOrder()方法的参数使用的Order是hibernate中的对象** ~~~ //得到一个Criteria对象 Criteria criteria = session.createCriteria(Goods.class); //指定排序 criteria.addOrder(org.hibernate.criterion.Order.asc("money")); //asc升序, desc降序 //调用list方法 List<Goods> list = criteria.list(); System.out.println(list); ~~~ ## 条件检索 ~~~ hql语句中,不能出现任何数据库相关的信息 > gt >= ge < lt <= le == eq != ne in in between and between like like is not null isNotNull is null isNull or or and and ~~~ ~~~ //查询名称叫 手机的 商品 Criteria criteria = session.createCriteria(Goods.class); //其他条件 lt <, gt >, le <=, ge >=, eq == Criterion like = Restrictions.like("name", "手机_"); //添加条件 criteria.add(like); Goods c = (Goods) criteria.uniqueResult(); System.out.println(c); //查询价格在1050以上,并且名称叫 手机的 商品 Criteria cri = session.createCriteria(Goods.class); // >1050 SimpleExpression lt = Restrictions.gt("money", 1050d); SimpleExpression eq = Restrictions.eq("c", c); LogicalExpression and = Restrictions.and(lt, eq); cri.add(and); //List<Goods> list = cri.add(Restrictions.and( // Restrictions.gt("money", 1050d), // Restrictions.eq("c", c) //)).list(); ~~~ ## 分页检索 ~~~ Criteria criteria = session.createCriteria(Goods.class); criteria.setFirstResult((2 - 1) * 6); criteria.setMaxResults(6); List<Goods> list = criteria.list(); System.out.println(list); ~~~ ## 统计分组检索 `Count sum avg max min` ~~~ //1. 统计订单总数 Criteria criteria = session.createCriteria(Goods.class); //Object obj = criteria.setProjection(Projections.rowCount()).uniqueResult(); //统计总行数 count(id) //System.out.println(obj); //2. 订单的总价格---分组统计根据客户 //criteria.setProjection(Projections.sum("money")); //统计总金额 criteria.setProjection( Projections.projectionList().add( Projections.sum("money")) .add(Projections.groupProperty("c") ) ); //这个集合保存的是Object[money的统计信息,客户信息] List<Object[]> list = criteria.list(); ~~~ ## 离线条件检索 在多条件查询的时候,需要在Web层封装相应的参数到Criteria, 而在Dao层才真正的去执行查询数据库的操作, 所以需要在Web层创建Criteria并将其传递到Dao层, 这个时候就不能在Web层使用session.createCriteria来创建Criteria, 因为Criteria的一般创建都是使用session.createCriteria(), 而session都是在Dao层才会创建的 ~~~ //1. 得到DetachedCriteria DetachedCriteria dc = DetachedCriteria.forClass(Goods.class); dc.add(Restrictions.like("name", "手机_")); //2. 生成Criteria执行操作 Session session = HibernateUtils.openSession(); Criteria criteria = dc.getExecutableCriteria(session); List<Goods> list = criteria.list(); System.out.println(list); ~~~