`
mxx_1111
  • 浏览: 59208 次
  • 性别: Icon_minigender_1
  • 来自: 济南
社区版块
存档分类
最新评论

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());
			}
			
		}


分享到:
评论

相关推荐

    Hibernate中Criteria的完整用法

    Hibernate中的Criteria API是一种用于执行动态查询的机制,它允许开发者在运行时构建SQL查询,而无需直接编写SQL语句。Criteria API提供了更加面向对象的方式来处理数据库查询,这使得代码更易于理解和维护,尤其是...

    hibernateCriteria查询

    查询条件是通过`org.hibernate.criterion.Restrictions` 类来定义的,这个类提供了许多静态方法来模拟SQL语句中的条件,例如`eq` (等于)、`gt` (大于)、`in` (包含在列表中)等。 #### 三、简单Criteria查询示例 ...

    hibernate如何使用criteria联合查询 group by 的语句

    这个案例是根据分组查询,并且得到每组的条数,不懂得可以q我:1710086675,欢迎认识更多新朋友

    Hibernate-Criteria_模糊查询

    在深入探讨Hibernate与Criteria结合进行模糊查询之前,我们先来了解一下Hibernate和Criteria的基本概念,以及为何选择使用它们进行模糊查询。 ### Hibernate简介 Hibernate是一个开放源代码的对象关系映射(ORM)...

    Criteria(hibernate3.0).rar_Criteria java_criteria Hibernate_hibe

    在Java持久化框架Hibernate中,Criteria API是一种强大的查询工具,它允许开发者以面向对象的方式构建SQL查询,从而避免了直接编写SQL语句的繁琐工作。Criteria API在Hibernate 3.0版本中得到了广泛应用,提供了更...

    Hibernate中,利用Criteria查询容器实现sql的写法

    在进行团队协作时,文件管理也非常重要,"java集成svn"可能指的是项目中使用了Subversion(SVN)作为版本控制系统。整合Hibernate Criteria查询与SVN,可以帮助团队成员同步代码,管理和跟踪查询的变化,确保项目的...

    Hibernate-Criteria 模糊查询

    这里的`Restrictions.like`方法等价于`Expression`中的`like`表达式,它允许你在查询中使用通配符,如“%”表示任意数量的字符,“_”表示单个字符。这样,任何名字以“Erica”开头的用户都将被查询出来。 #### ...

    Hibernate条件查询Criteria[参考].pdf

    Hibernate条件查询Criteria[参考].pdf

    Hibernate条件查询Criteria.doc

    Hibernate条件查询Criteria.docHibernate条件查询Criteria.doc

    Hibernate中Criteria的完整用法.docx

    使用 Criteria 进行查询,主要要清晰的是 Hibernate 提供了那些类和方法来满足开发中查询条件的创建和组装。例如,创建一个 Criteria 实例 org.hibernate.Criteria 接口表示,可以使用 Criteria 的 add(Criterion ...

    Hibernate中Criteria的用法

    Hibernate 中 Criteria 的用法是 Hibernate 框架中的一种查询机制,它提供了灵活的查询方式,可以根据不同的条件进行查询。Criteria 查询机制主要包括 QBE(Query By Example)、QBC(Query By Criteria)和 HQL...

    Hibernate中的Criteria的认识

    在深入探讨Hibernate框架中Criteria API的使用之前,我们先简要了解一下Hibernate本身。Hibernate是一个开源的对象关系映射(ORM)框架,它简化了Java应用程序与数据库之间的交互过程,通过将对象模型映射到数据库...

    Hibernate的Criteria用法总结.doc

    使用 Criteria 进行查询,主要要清晰的是 Hibernate 提供了那些类和方法来满足开发中查询条件的创建和组装。Criteria crit = session.createCriteria(User.class); crit.add(Restrictions.eq("name", "John")); List...

    Java的Hibernate框架中Criteria查询使用的实例讲解

    在Java的Hibernate框架中,Criteria查询提供了一种面向对象的方式来执行数据库查询,使得开发者无需直接编写SQL语句,尤其对不熟悉SQL的人来说更为友好。Criteria查询是Hibernate的一部分,它是SSH(Struts、Spring...

    Manning.Java.Persistence.with.Hibernate.Nov.2006.pdf

    这本书深入探讨了如何使用Hibernate来处理Java应用程序中的数据存储和检索问题,使得开发者可以更高效、更灵活地管理数据库。 Hibernate是一个开源的对象关系映射(ORM)框架,它简化了Java应用程序与数据库之间的...

    Hibernate的Criteria用法总结

    在Java持久层框架Hibernate中,Criteria API是一种动态构建SQL查询的方法,它允许开发者在运行时构建查询,提供了更面向对象的查询方式。本篇将详细阐述Hibernate Criteria API的使用。 首先,Criteria API由...

    Manning.Java.Persistence.with.Hibernate

    《Manning.Java.Persistence.with.Hibernate》一书是Hibernate领域的权威指南,由Hibernate项目的主导开发者撰写,深入浅出地讲解了Hibernate框架的核心概念、架构设计、配置方法以及在实际开发中的应用技巧。...

    Criteria的完整用法.pdf

    在基于Spring和Hibernate的项目开发中,Criteria API提供了灵活且强大的查询功能,使开发者能够轻松构建复杂的查询条件,从而提高数据检索的效率与精确度。本文将深入探讨Hibernate中Criteria API的全面应用,包括其...

    hibernate-release-5.3.2.Final

    3. 新的查询语言:HQL(Hibernate Query Language)和JPQL(Java Persistence Query Language)进一步完善,支持更复杂的查询表达式,同时增加了对构造函数查询的支持。 4. 错误修复和兼容性提升:5.3.2.Final修复了...

Global site tag (gtag.js) - Google Analytics