zoukankan      html  css  js  c++  java
  • Hibernate中使用Criteria查询及注解——(DeptTest.java)

    DeptTest.java

          测试类:

    先创建Session:

    private Session session;
    	private Transaction tx;
    	@Before
    	public void beforeMethod(){
    		
    		session=new Configuration()
    					.configure()
    					.buildSessionFactory()
    					.openSession();
    	}

    关闭Session:

    @After
    	public void afterMethod() {
    		if (session != null) {
    			session.close();
    
    		}
    	}

    开始测试:

        /**
         * 测试简单查询
         */

    @Test
    	public void testMethod1() {
    		
    		//查询所有的部门
    		Criteria criteria=session.createCriteria(Dept.class);
    		List<Dept> deptList=criteria.list();
    		for (Dept dept : deptList) {
    			System.out.println("部门编号:"+dept.getDeptno());
    			System.out.println("部门名称:"+dept.getDname());
    			System.out.println("部门编地址:"+dept.getLoc());
    		}
    	}


    查詢部门在山西吕梁的部门名称

    //查询部门地址在山西吕梁的部门名称
    	@Test
    	public void test2(){
    		List<Dept> deptList=session.createCriteria(Dept.class)
    							.add(Restrictions.eq("loc", "山西吕梁")).list();
    		for (Dept dept : deptList) {
    			System.out.println(dept.getDeptno()+","+dept.getDname());
    		}
    	}

    //查询工资高于5000的员工

    @Test
    	public void test3(){
    		List<Emp> empList=session
    								.createCriteria(Emp.class)
    								.add(Restrictions.gt("sal", 5000D)).list();
    		for (Emp emp : empList) {
    			System.out.println(emp.getEname()+","+emp.getSal());
    		}
    	}

    //查询不属于任何部门的员工

    @Test
    	public void test4(){
    		List<Emp> empList=session.createCriteria(Emp.class)
    				                 .add(Restrictions.isNull("dept")).list();
    		for (Emp emp : empList) {
    			System.out.println(emp.getEname());
    		}
    	}

    //查询职位是CLERK的员工
        //ignoreCase:不区分大小写

    @Test
    	public void test5(){
    		List<Emp> empList=session.createCriteria(Emp.class)
    				                 .add(Restrictions.eq("job","ClERK").ignoreCase())
    				                 .list();
    		for (Emp emp : empList) {
    			System.out.println(emp.getEname()+","+emp.getDept().getDname());
    		}
    	}


        /**
         * in:等于列表中的某一个值
         * not in:不等于列表中的任何一个值
         * between 值1 and 值2:大于等于值1并且小于值2
         * not between 值1 and 值2:小于值1或者大于值2
         */
        //查询职位是ANALYST 或  SALESMAN 的员工

    @Test
    	public void test6(){
    		List jobList=new ArrayList();
    		jobList.add("SALESMAN");
    		jobList.add("ANALYST");
    		List<Emp> empoList=session.createCriteria(Emp.class)
    				                   .add(Restrictions.in("job",jobList))
    				                   .list();
    		for (Emp emp : empoList) {
    			System.out.println(emp.getEname()+","+emp.getJob());
    		}
    	}

    //查询工资在2000元到4000元的员工
    @Test
    	public void test7(){
    		List<Emp> empList=session.createCriteria(Emp.class)
    				                 .add(Restrictions.between("sal", 2000D, 4000D))
    				                 .list();
    		for (Emp emp : empList) {
    			System.out.println(emp.getEname()+","+emp.getSal());
    		}
    	}

    /**
         * like:字符串模式匹配
         * ilike:字符串木事匹配,忽略大小写
         */
        //查询姓名中包括s的职位(like)

    @Test
    	public void test8(){
    		List<Emp> empList=session.createCriteria(Emp.class)
    				                  .add(Restrictions.like("job","%s%"))
    				                  .list();
    		for (Emp emp : empList) {
    			System.out.println(emp.getEname());
    		}
    	}

    //查询姓名中包括s的职位(ilike)

    @Test
    		public void test9(){
    			List<Emp> empList=session.createCriteria(Emp.class)
    					                  .add(Restrictions.ilike("job","%s%"))
    					                  .list();
    			for (Emp emp : empList) {
    				System.out.println(emp.getEname());
    			}
    		}

    /**
             * MatchMode静态常量
             * 1.MatchMode.STRART:   员工姓名以s开头
             * 2.MatchMode.END:                 员工姓名以s结尾
             * 3.MatchMode.ANYWHERE  员工姓名中包含s
             * 4.MatchMode.EXACT     员工姓名中等于s精确匹配
             */
            //查询职位中包括s的职位

    @Test
    		public void test10(){
    			List<Emp> empList=session.createCriteria(Emp.class)
    					                  .add(Restrictions.ilike("job","%s%",MatchMode.ANYWHERE))
    					                  .list();
    			for (Emp emp : empList) {
    				System.out.println(emp.getJob());
    			}
    		}

    /**
             *逻辑运算
             *1.and:逻辑与
             *2.or:逻辑或
             *3.not:逻辑非
             */
            //查询职位是accountant 或者是analyert的职位名称
    @Test
    		public void test11(){
    			List<Emp> empList=session.createCriteria(Emp.class)
    					                  .add(Restrictions.or(Restrictions.eq("job", "analyert").ignoreCase(),
    					                       Restrictions.eq("job","accountant").ignoreCase()))
    					                  .list();
    			for (Emp emp : empList) {
    				System.out.println(emp.getJob());
    			}
    		}

    //查询职位是accountant 或者是analyert 或者是 engineer的职位名称
    @Test
    			public void test12(){
    				List<Emp> empList=session.createCriteria(Emp.class)
    						                       .add(Restrictions.disjunction()
    						                	   .add(Restrictions.eq("job", "analyert").ignoreCase())
    						                       .add(Restrictions.eq("job","accountant").ignoreCase())
    						                       .add(Restrictions.eq("job", "engineer").ignoreCase()))
    						                       .list();
    				for (Emp emp : empList) {
    					System.out.println(emp.getJob());
    				}
    			}

    /**
                 * 集合运算符
                 * 1. is empty:集合为空,不包含任何元素
                 * 2. is not empty:集合不为空
                 */
                //查询没有员工的部门

    @Test
    			public void test13(){
    				List<Dept> deptList=session.createCriteria(Dept.class)
    						                 .add(Restrictions.isEmpty("emps"))
    						                 .list();
    				for (Dept dept : deptList) {
    					System.out.println(dept.getDname());
    				}
    			}

    /**
             * 动态查询
             * 条件见下:(条件类:EmpCondition)
             * 1.job是engineer
             * 2.sal大于2000
             * 3.入职时间在2006年12月31日到2008年12月31日之前
             */

    @Test
    		public void test14(){
    			SimpleDateFormat format=new SimpleDateFormat("yyyy-MM-dd");
    			EmpCondition empCondition=new EmpCondition();
    			try {
    				empCondition.setJob("engineer");
    				empCondition.setSal(2000D);
    				String hiredateStart="2006-12-31";
    				String hiredateEnd="2008-12-31";
    				Date hiredateStart1=format.parse(hiredateStart);
    				Date hiredateEnd1=format.parse(hiredateEnd);
    				empCondition.setHiredateStart(hiredateStart1);
    				empCondition.setHiredateEnd(hiredateEnd1);
    				
    			} catch (ParseException e) {
    				// TODO Auto-generated catch block
    				e.printStackTrace();
    			}

    //添加动态查询的条件

    Criteria criteria=session.createCriteria(Emp.class);
    			if(empCondition.getJob()!=null){
    				criteria.add(Restrictions.ilike("job", empCondition.getJob()));
    			}
    			if(empCondition.getSal()!=null){
    				criteria.add(Restrictions.gt("sal",empCondition.getSal()));
    			}
    			if(empCondition.getHiredateStart()!=null){
    				criteria.add(Restrictions.ge("hiredate",empCondition.getHiredateStart()));
    			}
    			if(empCondition.getHiredateEnd()!=null){
    				criteria.add(Restrictions.le("hiredate",empCondition.getHiredateEnd()));
    			}
    //输出
                List<Emp>emplist=criteria.list();
                for (Emp emp : emplist) {
                    System.err.println(emp.getEname()+","+emp.getJob()+","+emp.getSal()+","+emp.getHiredate());
                }
            }


            /**
             * 分页查询
             */
            //分页查询部门是SALESMAN 的所有员工
            //并且工资降序
            //显示总页数,总记录数,当前页号

    	@Test
    		public void test15(){
    			Criteria criteria =session.createCriteria(Emp.class)
    					                  .add(Restrictions.eq("job", "SALESMAN").ignoreCase())
    					                  .setProjection(Projections.count("empno"));
    			//获得总记录数
    			Integer count=(Integer)criteria.uniqueResult();
    			//分页
    			int pageSize=2;
    			int pageIndex=1;
    			int totalPage=count%pageSize==0?count/pageSize:(count/pageSize)+1;
    			criteria=session.createCriteria(Emp.class)
    					        .add(Restrictions.eq("job", "SALESMAN").ignoreCase())
    					        .addOrder(Order.desc("sal"));
    			//开始分页,设置从哪条记录开始查
    			List<Emp> emplist=criteria.setFirstResult((pageIndex-1)*pageSize)
    					                  .setMaxResults(pageSize)
    					                  .list();
    			
    			for (Emp emp : emplist) {
    				System.out.println(emp.getEname()+","+emp.getSal());
    			}
    			System.out.println("总页数:"+totalPage);
    			System.err.println("总记录数:"+count);
    			System.out.println("当前页号:"+pageIndex);
    		
    		}

    /**
             * 连接查询
             * Criteria里面只有内连接和迫切做外链接
             */
            //查询RESEARCH部们中姓名包括s的员工

    @Test
    		public void test16(){
    			List<Emp> emplistList=session.createCriteria(Emp.class)
    					                     .add(Restrictions.ilike("ename", "s",MatchMode.ANYWHERE))
    					                     .createCriteria("dept")
    					                     .add(Restrictions.eq("dname","RESEARCH").ignoreCase())
    					                     .list();
    			for (Emp emp : emplistList) {
    				System.out.println(emp.getEname()+","+emp.getDept().getDname());
    			}
    		}
    		
    		//查询RESEARCH部门中姓名包含s的员工
    		@Test
    		public void test17(){
    			List<Emp> empList=session.createCriteria(Emp.class,"e")
    					                 .createAlias("dept", "d")
    					                 .add(Restrictions.ilike("e.ename","s",MatchMode.ANYWHERE))
    					                 .add(Restrictions.eq("d.dname","RESEARCH").ignoreCase())
    					                 .list();
    			for (Emp emp : empList) {
    				System.out.println(emp.getEname()+","+emp.getDept().getDname());
    			}
    		}

    //左外连接
            //查询位置在山西吕梁的部门及其人数
            //FetchMode.JOIN表示迫切做外链接查询策略

    	@Test
    		public void test18(){
    			List<Dept> deptList=session.createCriteria(Dept.class,"d")
    					                   .setFetchMode("emps",FetchMode.JOIN)
    					                   .add(Restrictions.eq("d.loc","山西吕梁").ignoreCase())
    					                   .list();
    			for (Dept dept : deptList) {
    				System.out.println(dept.getDname()+","+dept.getLoc()+","+dept.getEmps().size());
    			}
    		}

    //去掉重复数据

    @Test
    		public void test19(){
    		List<Dept> deptList=session.createCriteria(Dept.class,"d")
    				                   .setFetchMode("emps", FetchMode.JOIN)
    				                   .add(Restrictions.eq("d.loc","山西吕梁").ignoreCase())
    				                   .list();
    		HashSet<Dept> set=new HashSet<Dept>(deptList);
    		for (Dept dept : set) {
    			System.out.println(dept.getDname()+","+dept.getLoc()+","+dept.getEmps().size());
    		}
    		
    		}    

    /**
             * 投影,分组,及DetachedCriteria
             */
            //查询所有的部门名称】

    @Test
    		public void test20(){
    			List<String> list=session.createCriteria(Dept.class)
    					                  .setProjection(Property.forName("dname"))
    					                  .list();
    			for (String str : list) {
    				System.out.println(str);
    			}
    		}

    //查询两个或者两个以上的属性
            //查询员工的姓名和入职时间
    @Test
    		public void test21(){
    			List<Object[]> list=session.createCriteria(Emp.class)
    					                   .setProjection(
    					                         Projections.projectionList()
    					                         .add(Property.forName("ename"))
    					                         .add(Property.forName("hiredate"))
    					                		   )
    					                		  .list();
    			
    			for (Object[] objects : list) {
    				System.out.println(objects[0]+","+objects[1]);
    			}
    					                   
    		}

    /**
             * 分组
             * 1.groupProperty:分组
             * 2.rowCount():统计记录数
             * 3.avg:平均值
             * 4.max:最大值
             * 5.min:最小值
             * 6.count:统计某一字段的非空记录数
             * 7.sum:针对某一字段进行求和
             */
            //统计各个部门的平均工资,最高工资,最低工资

    @Test
    		public void test22(){
    			List<Object[]> list=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();
    			for (Object[] objects : list) {
    				System.out.println("部门名称"+objects[0]+",最高工资:"+objects[2]+"" +
    						",平均工资:"+objects[1]+",最低工资:"+objects[3]);
    			}
    					                   
    		}

    //使用DetachedCriteria
            //查询RESEARCH部门,姓名包含“a”的员工

    @Test
    		public void test23(){
    			DetachedCriteria detachedCriteria
    			           =DetachedCriteria.forClass(Emp.class,"e")
    					           .createAlias("e.dept","d")
    					           .add(Restrictions.eq("d.dname","RESEARCH").ignoreCase())
    					           .add(Restrictions.ilike("e.ename","a",MatchMode.ANYWHERE));
    			List<Emp> list=detachedCriteria.getExecutableCriteria(session).list();
    			for (Emp emp : list) {
    				System.out.println(emp.getEname()+","+emp.getDept().getDname());
    			}
    					                        
    		}

    //查询工资高于平均工资的员工

    @Test
    		public void test24(){
    			//平均工资
    			DetachedCriteria detachedCriteria=DetachedCriteria
    					             .forClass(Emp.class,"e")
    					             .setProjection(Property.forName("sal").avg());
    			//求工资大于平均工资
    			List<Emp> emplist=session.createCriteria(Emp.class)
    					                 .add(Property.forName("sal").gt(detachedCriteria)).list();
    			for (Emp emp : emplist) {
    				System.out.println(emp.getEname()+","+emp.getSal());
    			}
    			
    		}


  • 相关阅读:
    在IE和Firfox获取keycode
    using global variable in android extends application
    using Broadcast Receivers to listen outgoing call in android note
    help me!virtual keyboard issue
    using iscroll.js and iscroll jquery plugin in android webview to scroll div and ajax load data.
    javascript:jquery.history.js使用方法
    【CSS核心概念】弹性盒子布局
    【Canvas学习笔记】基础篇(二)
    【JS核心概念】数据类型以及判断方法
    【问题记录】ElementUI上传组件使用beforeupload钩子校验失败时的问题处理
  • 原文地址:https://www.cnblogs.com/a1111/p/7459765.html
Copyright © 2011-2022 走看看