hibernate-criteria查询(二)

? Restrictions 类的作用是什么?
? Criteria 接口没有 iterate() 方法。
? Criteria 查询如何对查询结果排序、分页?
? Criteria 查询如何实现关联?
? Criteria 查询如何实现分组聚合?
? DetachedCriteria 有什么作用?

用代码告诉你:

package Test;

import java.text.SimpleDateFormat;
import java.util.Iterator;
import java.util.List;

import org.hibernate.Criteria;
import org.hibernate.Session;

import org.hibernate.criterion.DetachedCriteria;
import org.hibernate.criterion.MatchMode;
import org.hibernate.criterion.Order;
import org.hibernate.criterion.ProjectionList;
import org.hibernate.criterion.Projections;
import org.hibernate.criterion.Property;
import org.hibernate.criterion.Restrictions;
import org.junit.Test;

import entity.Dept;
import entity.Emp;
import entity.QueryCondition;

import util.HibernateSessionFactory;

//criteria查询
public class TestCriteria {

    @Test
    public void Test1(){
        Session session =HibernateSessionFactory.getSession();
        try {
            Criteria criteria = session.createCriteria(Emp.class);
            Iterator<Emp> iter = criteria.list().iterator();
            while(iter.hasNext()){
                Emp emp=iter.next();
                System.out.println(emp.getEname());
            }
        } catch (Exception e) {
            // TODO: handle exception
        }
    }
    /*    职位是工程师,如:job = ‘engineer’
    ?工资大于2000元,如:salary > 2000
    ?入职时间在2006年12月31日至2008年12月31日之间
    模糊查询的时候可以使用
    criteria动态查询
    */
    @Test
    public void Test2(){
        Session session =HibernateSessionFactory.getSession();
        try {
            Criteria criteria = session.createCriteria(Emp.class);
            QueryCondition queryCondition=new QueryCondition();
            queryCondition.setStartdate(new SimpleDateFormat("yyyy-MM-dd").parse("1980-12-17"));
            queryCondition.setEnddate(new SimpleDateFormat("yyyy-MM-dd").parse("1987-12-32"));
            Emp emp =new Emp();
            emp.setSal(2000D);
            //emp.setJob("SALESMAN");
            if(queryCondition.getStartdate()!=null){
                criteria.add(Restrictions.gt("hiredate",queryCondition.getStartdate() ));
            }
            if(queryCondition.getEnddate()!=null){
                criteria.add(Restrictions.lt("hiredate",queryCondition.getEnddate() ));
            }
            if(emp.getSal()!=null){
                criteria.add(Restrictions.gt("sal", 2000D));
            }
            if(emp.getJob()!=null){
                criteria.add(Restrictions.eq("job", "SALESMAN"));
            }

            List<Emp> emplist = criteria.list();
            for (Emp emp1 : emplist) {
                System.out.println(emp1.getJob()+"\t"+emp1.getSal()+"\t"+emp1.getHiredate());
            }
        } catch (Exception e) {
            // TODO: handle exception
        }
    }

    /*    职位是工程师,如:job = ‘engineer’
    ?工资大于2000元,如:salary > 2000
    ?入职时间在2006年12月31日至2008年12月31日之间
    模糊查询的时候可以使用,加上分页
    */
    @Test
    public void Test3(){
        Session session =HibernateSessionFactory.getSession();
        try {
            Criteria criteria = session.createCriteria(Emp.class);
            QueryCondition queryCondition=new QueryCondition();
            queryCondition.setStartdate(new SimpleDateFormat("yyyy-MM-dd").parse("1980-12-17"));
            queryCondition.setEnddate(new SimpleDateFormat("yyyy-MM-dd").parse("1987-12-32"));
            Emp emp =new Emp();
            emp.setSal(2000D);
            //emp.setJob("SALESMAN");
            if(queryCondition.getStartdate()!=null){
                criteria.add(Restrictions.gt("hiredate",queryCondition.getStartdate() ));
            }
            if(queryCondition.getEnddate()!=null){
                criteria.add(Restrictions.lt("hiredate",queryCondition.getEnddate() ));
            }
            if(emp.getSal()!=null){
                criteria.add(Restrictions.gt("sal", 2000D));
            }
            if(emp.getJob()!=null){
                criteria.add(Restrictions.eq("job", "SALESMAN"));
            }
            //设置每页显示多少条
            int pageSize=2;
            int pageNo=2;//当前第几页
            //得出总页数
            int totalCount =(Integer) criteria.setProjection(Projections.rowCount()).uniqueResult();
            int totalPage = totalCount%pageSize==0?totalCount/pageSize:totalCount/pageSize+1;
            criteria.setProjection(null);
            criteria.setFirstResult(pageNo);//第几页的查询
            criteria.setMaxResults(pageSize);//最多显示几条

            List<Emp> emplist = criteria.list();
            for (Emp emp1 : emplist) {
                System.out.println(emp1.getJob()+"\t"+emp1.getSal()+"\t"+emp1.getHiredate());
            }
        } catch (Exception e) {
            // TODO: handle exception
        }
    }

    /*criteria排序
     * 按员工工资降序排列
     * */
    @Test
    public void test4(){
        Session session =HibernateSessionFactory.getSession();
        try {
            Criteria criteria = session.createCriteria(Emp.class,"e");
            criteria.add(Restrictions.gt("sal", 2000D));
            //criteria.addOrder(Order.asc("sal"));//按工资升序
            criteria.addOrder(Order.desc("empno"));//按工号降序
            List<Emp> emplist = criteria.list();
            for (Emp emp : emplist) {
                System.out.println(emp.getEmpno()+"\t"+emp.getEname()+"\t"+emp.getSal());
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /*查询工资最高的员工*/
    @Test
    public void test5(){
        Session session =HibernateSessionFactory.getSession();
        try {
            Object obj=session.createCriteria(Emp.class,"e")
                    .add(Restrictions.isNotEmpty("e.sal"))
                    .addOrder(Order.desc("e.sal"))
                    .setMaxResults(1)
                    .uniqueResult();

            System.out.println(obj.toString());

        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /*联合查询
     *
     * MatchMode.START:字符串在最前面的位置.相当于"like ‘key%‘"
MatchMode.END:字符串在最后面的位置.相当于"like ‘%key‘"
MatchMode.ANYWHERE:字符串在中间匹配.相当于"like ‘%key%‘"
MatchMode.EXACT:字符串精确匹配.相当于"like ‘key‘"
     * */
    @SuppressWarnings("unchecked")
    @Test
    public void test6(){
        Session session =HibernateSessionFactory.getSession();
        try {
            List<Emp> emplist=session.createCriteria(Emp.class,"e")
                    .add(Restrictions.ilike("e.ename", "A",MatchMode.ANYWHERE))
                    .createAlias("dept", "d").add(Restrictions.eq("d.dname", "SALES")).list();

            for (Emp emp : emplist) {
                System.out.println(emp.getEname()+"\t"+emp.getDept().getDname());
            }

        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * 查询部门名称
     * 投影查询:属性查询
     */
    @SuppressWarnings("unchecked")
    @Test
    public void test7(){
        Session session =HibernateSessionFactory.getSession();
        try {
            List<String> deptlist = session.createCriteria(Dept.class).setProjection(Property.forName("dname")).list();

            for (String string : deptlist) {
                System.out.println(string);
            }

        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * 查询部门名称
     * 投影查询:查询员工姓名、工资和部门
     */
    @SuppressWarnings("unchecked")
    @Test
    public void test8(){
        Session session =HibernateSessionFactory.getSession();
        try {
            List<Object[]> deptlist = session.createCriteria(Emp.class,"e")
                    .createAlias("e.dept", "d")
                    .setProjection(Projections.projectionList()
                            .add(Property.forName("e.ename"))
                            .add(Property.forName("e.sal"))
                            .add(Property.forName("d.dname"))).list();
            System.out.println(deptlist.size());
            for (Object[] obj : deptlist) {
                System.out.println(obj[0] + ","+obj[1]+","+obj[2]);
            }

        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * 统计各个部门的平均工资、最高工资、最低工资
     */
    @SuppressWarnings("unchecked")
    @Test
    public void test9(){
        Session session =HibernateSessionFactory.getSession();
        try {
            List<Object[]> deptlist = session.createCriteria(Emp.class,"e")
                    .createAlias("e.dept", "d")
                    .setProjection(Projections.projectionList()
                            .add(Projections.groupProperty("d.dname"))
                            .add(Projections.avg("e.sal"))
                            .add(Projections.max("e.sal"))
                            .add(Projections.min("e.sal"))).list();
            System.out.println("各部门平均工资、最高工资、最低工资是:============");
            for (Object[] obj : deptlist) {

                System.out.println(obj[0] + ","+obj[1]+","+obj[2]);
            }

        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * 使用DetachedCriteria查询财务部的姓名包括“a”的员工
     * DetachedCriteria 和 Criteria 功能类似
?Criteria是由Session对象创建的,
DetachedCriteria创建时不需要Session对象
?可以把DetachedCriteria作为方法参数传递来构造查
询条件
     */
    @SuppressWarnings("unchecked")
    @Test
    public void test10(){
        Session session =HibernateSessionFactory.getSession();
        try {
            DetachedCriteria detachedCriteria=DetachedCriteria.forClass(Emp.class,"e")
                    .createAlias("e.dept", "d")
                    .add(Restrictions.eq("d.dname", "SALES"))
                    .add(Restrictions.ilike("e.ename", "a",MatchMode.ANYWHERE));
            List<Emp> list = detachedCriteria.getExecutableCriteria(session).list();
            System.out.println("使用DetachedCriteria查询财务部的姓名包括“a”的员工==============");
            for (Emp emp : list) {
                System.out.println(emp.getEname()+"\t"+emp.getDept().getDname());
            }

        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * 使用DetachedCriteria作为查询条件,查询工资高于平均工资的员工
     */
    @SuppressWarnings("unchecked")
    @Test
    public void test11(){
        Session session =HibernateSessionFactory.getSession();
        try {
            DetachedCriteria avgsal=DetachedCriteria.forClass(Emp.class,"e")
                    .setProjection(Projections.avg("e.sal"));
            List<Emp> list = session.createCriteria(Emp.class,"e")
            .createAlias("e.dept", "d")
            .add(Property.forName("e.sal").gt(avgsal)).list();
            for (Emp emp : list) {
                System.out.println(emp.getEname()+"\t"+emp.getSal());
            }

        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
时间: 2024-10-07 05:22:11

hibernate-criteria查询(二)的相关文章

hibernate Criteria查询 2.3

Criteria对象提供了一种面向对象的方式查询数据库.Criteria对象需要使用Session对象来获得一个Criteria对象表示对一个持久化类的查询 查询所有 Session session = HibernateUtil.getSession(); session.beginTransaction(); Criteria cri = session.createCriteria(User.class); List<User> list = cri.list(); for(User u

Hibernate(十二)Criteria查询

一.简述 Criteria是一种比hql更面向对象的查询方式.Criteria 可使用 Criterion 和 Projection 设置查询条件.可以设置 FetchMode(联合查询抓取的模式 ) ,设置排序方式,Criteria 还可以设置 FlushModel (冲刷 Session 的方式)和 LockMode (数据库锁模式). Criteria本身只是查询的容器.Criteria查询又称对象查询 Criteria查询采用面向对象的方式封装查询条件.由Hibernater自动生成SQ

hibernate条件查询 Criteria查询

criteria查询 的方法详解 1.获取 criteria对象 Criteria criteria = this.getSession().createCriteria(Record.class); 红色部分为实体类,此处的Record代表信息记录类 2.追加条件 criteria = criteria.add(Expression.eq("level", 1)); 红色部分 Expression.eq("",""),两个参数第一个是 实体类中

第六讲(二) Hibernate HQL查询

HQL查询:Criteria查询对查询条件进行了面向对象封装,符合编程人员的思维方式,不过HQL(Hibernate Query Lanaguage)查询提供了更加丰富的和灵活的查询特性,因此Hibernate将HQL查询方式立为官方推荐的标准查询方式,HQL查询在涵盖 Criteria查询的所有功能的前提下,提供了类似标准SQL语句的查询方式,同时也提供了更加面向对象的封装.完整的HQL语句形势如下:Select/update/delete…… from …… where …… group b

Hibernate(十)HQL查询二

一.数据库的emp名和dept表 建立持久化类和配置文件,可以用MyEclipse直接生成 持久化类 package entity; import java.util.Date; public class Emp implements java.io.Serializable { // Fields private Short empno; private Dept dept; private String ename; private String job; private Short mgr

Hibernate框架之HQL查询与Criteria 查询的区别

Hibernate框架提供了HQL查询和Criteria 查询.下面对这两种查询分别做个例子.也好对这两种查询方法有个大概的了解.就用房屋信息表做例子,查询所有房屋信息. HQL语句查询所有房屋信息: /* * 查询所有房屋 * * (non-Javadoc) * @see Dao.HouseDao#selecthouse() */ public List<House> selecthouse() { // TODO Auto-generated method stub //获取连接 Sess

Hibernate检索方式和Criteria查询的讲解

Hibernate框架5种检索方式 1.导航对象图检索方式:根据已经加载的对象导航到其他对象 2.OID检索方式:按照对象的OID来检索对象 3.HQL检索方式:使用面向对象的HQL查询语言 4.QBC检索方式:使用QBC(Query By Criteria)API来检索对象,这种API封装了基于字符串形式的查询语句,提供了更加面向对象的查询接口 5.本地SQL检索方式:使用本地数据库的SQL查询语句 这次重点讲解Criteria查询,首先我们先了解一下它.  Criteria 查询采用面向对象

hibernate框架学习笔记7:HQL查询、Criteria查询

HQL查询:hibernate独有的查询语言 适用于不复杂的多表查询 示例: 实体类: package domain; public class Customer { private Long cust_id; private String cust_name; private String cust_source; private String cust_industry; private String cust_level; private String cust_linkman; priv

hibernate框架学习笔记11:Criteria查询详解

创建实体类对象: package domain; import java.util.HashSet; import java.util.Set; //客户实体 public class Customer { private Long cust_id; private String cust_name; private String cust_source; private String cust_industry; private String cust_level; private Strin

2018.11.13 Hibernate 中数据库查询中的Criteria查询实例

Criteria是面向对象的无语句查询 Demo.java package com.legend.b_criteria; import java.util.List; import org.hibernate.Criteria; import org.hibernate.Session; import org.hibernate.Transaction; import org.hibernate.criterion.Order; import org.hibernate.criterion.Pr