hibernate11–Criteria查询详解编程语言

复制代码
public class EmpTest { 
Session session =null; 
Transaction transaction=null; 
@Before 
public  void  before(){ 
session = HibernateSessionUtil.getCurrentSession(); 
transaction= session.beginTransaction(); 
} 
/** 
* Criteria 查询接口:完全是面向对象的思想来 操作数据库! 
* 看不到sql看不到hql! 
* 01.查询所有的部门信息 
*/ 
@Test 
public  void  test01(){ 
Criteria criteria=session.createCriteria(Dept.class);   //createQuery("from Dept"); 
List<Dept>list = criteria.list(); 
for (Dept dept : list) { 
System.out.println(dept); 
} 
}     
/** 
* 02.查询指定的部门信息     eq(属性名,属性值) 
* Restrictions:给我们的查询增加条件 
*      001.Restrictions中的方法都是静态的 
*      002.方法的返回是都是    Criterion或者其实现类 
*/ 
@Test 
public  void  test02(){ 
Criteria criteria=session.createCriteria(Dept.class);   //createQuery("from Dept"); 
criteria.add(Restrictions.eq("deptName", "研发部")); //给查询增加条件 
Dept dept = (Dept) criteria.uniqueResult(); 
System.out.println(dept); 
}     
/** 
* 03.查询员工薪水大于10k的    gt(属性名,属性值) 
*/ 
@Test 
public  void  test03(){ 
Criteria criteria=session.createCriteria(Emp.class);    
criteria.add(Restrictions.gt("salary", 10000d)); //给查询增加条件 
List<Emp> list = criteria.list(); 
for (Emp emp : list) { 
System.out.println(emp); 
} 
}     
/** 
* 04.查询员工薪水大于5k的  小于100k   bw(属性名,属性值1,属性值2) 
*/ 
@Test 
public  void  test04(){ 
Criteria criteria=session.createCriteria(Emp.class);    
criteria.add(Restrictions.between("salary", 5000d, 100000d)); //给查询增加条件 
List<Emp> list = criteria.list(); 
for (Emp emp : list) { 
System.out.println(emp); 
} 
}     
/** 
* 05.查询没有部门的员工     dept是我们Emp类中的一个域属性  对象为null  使用 isNull 
*/ 
@Test 
public  void  test05(){ 
Criteria criteria=session.createCriteria(Emp.class);    
criteria.add(Restrictions.isNull("dept")); //给查询增加条件 
List<Emp> list = criteria.list(); 
for (Emp emp : list) { 
System.out.println(emp); 
} 
}     
/** 
* 06.查询没有员工的 部门    emps是我们Dept类中的一个集合    集合的size=0   使用 isEmpty 
*/ 
@Test 
public  void  test06(){ 
Criteria criteria=session.createCriteria(Dept.class);    
criteria.add(Restrictions.isEmpty("emps")); //给查询增加条件 
List<Dept> list = criteria.list(); 
for (Dept dept : list) { 
System.out.println(dept); 
} 
}     
/** 
* 07.查询 员工姓名是  员工1  或者 员工2的信息 
*   两种情况  使用or 
*/ 
@Test 
public  void  test07(){ 
Criteria criteria=session.createCriteria(Emp.class);  
//给查询增加条件 
        criteria.add(Restrictions.or 
(Restrictions.eq("empName", "员工1"), 
Restrictions.eq("empName", "员工2")));  
List<Emp> list = criteria.list(); 
for (Emp emp : list) { 
System.out.println(emp); 
} 
}     
/** 
* 08.查询 员工姓名是  员工1  或者 员工2的信息 
*   两种情况  使用in(属性名,集合) 
*/ 
@Test 
public  void  test08(){ 
Criteria criteria=session.createCriteria(Emp.class);  
List<String> names=new ArrayList<>(); 
names.add("员工1"); 
names.add("员工2"); 
//给查询增加条件 
criteria.add(Restrictions.in("empName", names));  
List<Emp> list = criteria.list(); 
for (Emp emp : list) { 
System.out.println(emp); 
} 
}     
/** 
* 09.查询 员工姓名是  员工1  或者 员工2 ,员工3  员工4 的信息 
*   两种情况  使用in(属性名,集合) 
*/ 
@Test 
public  void  test09(){ 
Criteria criteria=session.createCriteria(Emp.class);  
List<String> names=new ArrayList<>(); 
names.add("员工1"); 
names.add("员工2"); 
names.add("员工3"); 
names.add("员工4"); 
//给查询增加条件 
criteria.add(Restrictions.in("empName", names));  
List<Emp> list = criteria.list(); 
for (Emp emp : list) { 
System.out.println(emp); 
} 
}     
/** 
* 10.查询 员工姓名是  员工1  或者 员工2 ,员工3  员工4 的信息 
*   
*  Restrictions.disjunction()返回一个Disjunction对象 
*  Disjunction 继承了Junction 
*  Junction中有一个add() 
*   底层代码 
*  public Junction add(Criterion criterion) { 
criteria.add(criterion); 
return this; 
} 
*/ 
@Test 
public  void  test10(){ 
Criteria criteria=session.createCriteria(Emp.class);  
//给查询增加条件 
        criteria.add(Restrictions.disjunction() 
.add(Restrictions.eq("empName", "员工1")) 
.add(Restrictions.eq("empName", "员工2")) 
.add(Restrictions.eq("empName", "员工3")) 
.add(Restrictions.eq("empName", "员工4")) 
);  
List<Emp> list = criteria.list(); 
for (Emp emp : list) { 
System.out.println(emp); 
} 
}     
/** 
* 11.查询 员工姓名包含 A 的员工信息 
*    like  模糊查询  
*/ 
@Test 
public  void  test11(){ 
Criteria criteria=session.createCriteria(Emp.class);  
//给查询增加条件 
criteria.add(Restrictions.like("empName", "%A%"));  
List<Emp> list = criteria.list(); 
for (Emp emp : list) { 
System.out.println(emp); 
} 
}     
/** 
* 12.查询 员工姓名包含 A/a 的员工信息 
*    ilike  模糊查询    忽略大小写   
*/ 
@Test 
public  void  test12(){ 
Criteria criteria=session.createCriteria(Emp.class);  
//给查询增加条件 
criteria.add(Restrictions.ilike("empName", "%A%"));  
List<Emp> list = criteria.list(); 
for (Emp emp : list) { 
System.out.println(emp); 
} 
}     
/** 
* 13.查询 员工姓名包含 A 的员工信息 
*    like  模糊查询   
*    MatchMode:  我们value值出现的位置    可以替换%    
*    MatchMode.ANYWHERE:前后 
*    MatchMode.END:后 
*    MatchMode.START:前 
*/ 
@Test 
public  void  test13(){ 
Criteria criteria=session.createCriteria(Emp.class);  
//给查询增加条件 
criteria.add(Restrictions.like("empName", "A",MatchMode.ANYWHERE));  
List<Emp> list = criteria.list(); 
for (Emp emp : list) { 
System.out.println(emp); 
} 
}     
/** 
* 14.聚合函数   和 投影查询    Projections 
*  
* 查询 薪水的最大值 最小值   总薪水 和平均薪水 
* criteria.setProjection   是赋值操作 
* 如果不清空Projection   
* 之前给的值   会带入下次的查询 
*/ 
@Test 
public  void   test14(){ 
Criteria criteria = session.createCriteria(Emp.class); 
criteria.setProjection( 
Projections.projectionList() 
.add(Projections.max("salary")) 
.add(Projections.min("salary")) 
.add(Projections.sum("salary")) 
.add(Projections.avg("salary")) 
); 
//criteria.setProjection(null);   清空所有的约束 
List<Object[]> list = criteria.list(); 
for (Object[] objects : list) { 
System.out.println("最大薪水:"+objects[0]); 
System.out.println("最小薪水:"+objects[1]); 
System.out.println("总薪水:"+objects[2]); 
System.out.println("平均薪水:"+objects[3]); 
} 
} 
/** 
* 15. 分页查询 
*   查询姓名中 包含 "员工" 的  并且 按照 薪水 降序排列 
*/ 
@Test 
public  void   test15(){ 
//查询总记录数 
int count=((Long)session.createCriteria(Emp.class) 
.add(Restrictions.like("empName", "员工",MatchMode.ANYWHERE)) 
.setProjection(Projections.count("empName")).uniqueResult()).intValue(); 
System.out.println("总记录数是:"+count); 
//当前页 
int  pageIndex=1; 
//页大小 
int  pageSize=4; 
//总页数 
int  totalPageSize=(count%pageSize==0)?(count/pageSize):(count/pageSize+1); 
//进行薪水的降序排列 
Criteria criteria=    session.createCriteria(Emp.class) 
.add(Restrictions.like("empName", "员工",MatchMode.ANYWHERE)) 
.addOrder(Order.desc("salary")); 
//设置 当前页 以及页大小 
List<Emp> list = criteria.setFirstResult((pageIndex-1)*pageSize).setMaxResults(pageSize).list(); 
for (Emp emp : list) { 
System.out.println(emp); 
} 
} 
/** 
* 16:面试题 
* DetachedCriteria和 Criteria的区别 
* 相同点:都能用来 做查询操作 
* 不同点: 
*    01.DetachedCriteria在创建的时候 不需要session!  
*    02.真正执行查询的时候getExecutableCriteria(session)才使用session 
*    03.DetachedCriteria自身可以作为一个参数 
*     
*  薪水  大于    平均值的员工信息    
*/ 
@Test 
public  void   test16(){ 
//得到DetachedCriteria对象 
DetachedCriteria criteria= DetachedCriteria.forClass(Emp.class) 
.setProjection(Projections.avg("salary")); 
//执行查询 
double  avg=(double) criteria.getExecutableCriteria(session).uniqueResult(); 
System.out.println("薪水的平均值是:"+avg); 
//薪水 大于    平均值的员工信息    
List<Emp> list = session.createCriteria(Emp.class).add( 
Property.forName("salary").gt(criteria)).list(); 
for (Emp emp : list) { 
System.out.println(emp); 
} 
} 
}

public class EmpTest { Session session =null; Transaction transaction=null; @Before public  void before(){ session = HibernateSessionUtil.getCurrentSession(); transaction= session.beginTransaction(); } /** * Criteria 查询接口:完全是面向对象的思想来 操作数据库! * 看不到sql看不到hql! * 01.查询所有的部门信息 */ @Test public  void test01(){ Criteria criteria=session.createCriteria(Dept.class);   //createQuery(“from Dept”);
        List<Dept>list = criteria.list(); for (Dept dept : list) { System.out.println(dept); } } /** * 02.查询指定的部门信息 eq(属性名,属性值) * Restrictions:给我们的查询增加条件 * 001.Restrictions中的方法都是静态的 * 002.方法的返回是都是 Criterion或者其实现类 */ @Test public  void test02(){ Criteria criteria=session.createCriteria(Dept.class);   //createQuery(“from Dept”);
        criteria.add(Restrictions.eq(“deptName”, “研发部”)); //给查询增加条件
        Dept dept = (Dept) criteria.uniqueResult(); System.out.println(dept); } /** * 03.查询员工薪水大于10k的 gt(属性名,属性值) */ @Test public  void test03(){ Criteria criteria=session.createCriteria(Emp.class); criteria.add(Restrictions.gt(“salary”, 10000d)); //给查询增加条件
         List<Emp> list = criteria.list(); for (Emp emp : list) { System.out.println(emp); } } /** * 04.查询员工薪水大于5k的 小于100k bw(属性名,属性值1,属性值2) */ @Test public  void test04(){ Criteria criteria=session.createCriteria(Emp.class); criteria.add(Restrictions.between(“salary”, 5000d, 100000d)); //给查询增加条件
        List<Emp> list = criteria.list(); for (Emp emp : list) { System.out.println(emp); } } /** * 05.查询没有部门的员工 dept是我们Emp类中的一个域属性 对象为null 使用 isNull */ @Test public  void test05(){ Criteria criteria=session.createCriteria(Emp.class); criteria.add(Restrictions.isNull(“dept”)); //给查询增加条件
        List<Emp> list = criteria.list(); for (Emp emp : list) { System.out.println(emp); } } /** * 06.查询没有员工的 部门 emps是我们Dept类中的一个集合 集合的size=0 使用 isEmpty */ @Test public  void test06(){ Criteria criteria=session.createCriteria(Dept.class); criteria.add(Restrictions.isEmpty(“emps”)); //给查询增加条件
        List<Dept> list = criteria.list(); for (Dept dept : list) { System.out.println(dept); } } /** * 07.查询 员工姓名是 员工1 或者 员工2的信息 * 两种情况 使用or */ @Test public  void test07(){ Criteria criteria=session.createCriteria(Emp.class); //给查询增加条件
criteria.add(Restrictions.or (Restrictions.eq(“empName”, “员工1”), Restrictions.eq(“empName”, “员工2”))); List<Emp> list = criteria.list(); for (Emp emp : list) { System.out.println(emp); } } /** * 08.查询 员工姓名是 员工1 或者 员工2的信息 * 两种情况 使用in(属性名,集合) */ @Test public  void test08(){ Criteria criteria=session.createCriteria(Emp.class); List<String> names=new ArrayList<>(); names.add(“员工1”); names.add(“员工2”); //给查询增加条件
        criteria.add(Restrictions.in(“empName”, names)); List<Emp> list = criteria.list(); for (Emp emp : list) { System.out.println(emp); } } /** * 09.查询 员工姓名是 员工1 或者 员工2 ,员工3 员工4 的信息 * 两种情况 使用in(属性名,集合) */ @Test public  void test09(){ Criteria criteria=session.createCriteria(Emp.class); List<String> names=new ArrayList<>(); names.add(“员工1”); names.add(“员工2”); names.add(“员工3”); names.add(“员工4”); //给查询增加条件
        criteria.add(Restrictions.in(“empName”, names)); List<Emp> list = criteria.list(); for (Emp emp : list) { System.out.println(emp); } } /** * 10.查询 员工姓名是 员工1 或者 员工2 ,员工3 员工4 的信息 * * Restrictions.disjunction()返回一个Disjunction对象 * Disjunction 继承了Junction * Junction中有一个add() * 底层代码 * public Junction add(Criterion criterion) { criteria.add(criterion); return this; } */ @Test public  void test10(){ Criteria criteria=session.createCriteria(Emp.class); //给查询增加条件
criteria.add(Restrictions.disjunction() .add(Restrictions.eq(“empName”, “员工1”)) .add(Restrictions.eq(“empName”, “员工2”)) .add(Restrictions.eq(“empName”, “员工3”)) .add(Restrictions.eq(“empName”, “员工4”)) ); List<Emp> list = criteria.list(); for (Emp emp : list) { System.out.println(emp); } } /** * 11.查询 员工姓名包含 A 的员工信息 * like 模糊查询 */ @Test public  void test11(){ Criteria criteria=session.createCriteria(Emp.class); //给查询增加条件
        criteria.add(Restrictions.like(“empName”, “%A%”)); List<Emp> list = criteria.list(); for (Emp emp : list) { System.out.println(emp); } } /** * 12.查询 员工姓名包含 A/a 的员工信息 * ilike 模糊查询 忽略大小写 */ @Test public  void test12(){ Criteria criteria=session.createCriteria(Emp.class); //给查询增加条件
        criteria.add(Restrictions.ilike(“empName”, “%A%”)); List<Emp> list = criteria.list(); for (Emp emp : list) { System.out.println(emp); } } /** * 13.查询 员工姓名包含 A 的员工信息 * like 模糊查询 * MatchMode: 我们value值出现的位置 可以替换% * MatchMode.ANYWHERE:前后 * MatchMode.END:后 * MatchMode.START:前 */ @Test public  void test13(){ Criteria criteria=session.createCriteria(Emp.class); //给查询增加条件
        criteria.add(Restrictions.like(“empName”, “A”,MatchMode.ANYWHERE)); List<Emp> list = criteria.list(); for (Emp emp : list) { System.out.println(emp); } } /** * 14.聚合函数 和 投影查询 Projections * * 查询 薪水的最大值 最小值 总薪水 和平均薪水 * criteria.setProjection 是赋值操作 * 如果不清空Projection * 之前给的值 会带入下次的查询 */ @Test public  void test14(){ Criteria criteria = session.createCriteria(Emp.class); criteria.setProjection( Projections.projectionList() .add(Projections.max(“salary”)) .add(Projections.min(“salary”)) .add(Projections.sum(“salary”)) .add(Projections.avg(“salary”)) ); //criteria.setProjection(null); 清空所有的约束
        List<Object[]> list = criteria.list(); for (Object[] objects : list) { System.out.println(“最大薪水:”+objects[0]); System.out.println(“最小薪水:”+objects[1]); System.out.println(“总薪水:”+objects[2]); System.out.println(“平均薪水:”+objects[3]); } } /** * 15. 分页查询 * 查询姓名中 包含 “员工” 的 并且 按照 薪水 降序排列 */ @Test public  void test15(){ //查询总记录数
        int count=((Long)session.createCriteria(Emp.class) .add(Restrictions.like(“empName”, “员工”,MatchMode.ANYWHERE)) .setProjection(Projections.count(“empName”)).uniqueResult()).intValue(); System.out.println(“总记录数是:”+count); //当前页
        int  pageIndex=1; //页大小
        int  pageSize=4; //总页数
        int  totalPageSize=(count%pageSize==0)?(count/pageSize):(count/pageSize+1); //进行薪水的降序排列
       Criteria criteria=    session.createCriteria(Emp.class) .add(Restrictions.like(“empName”, “员工”,MatchMode.ANYWHERE)) .addOrder(Order.desc(“salary”)); //设置 当前页 以及页大小
       List<Emp> list = criteria.setFirstResult((pageIndex-1)*pageSize).setMaxResults(pageSize).list(); for (Emp emp : list) { System.out.println(emp); } } /** * 16:面试题 * DetachedCriteria和 Criteria的区别 * 相同点:都能用来 做查询操作 * 不同点: * 01.DetachedCriteria在创建的时候 不需要session! * 02.真正执行查询的时候getExecutableCriteria(session)才使用session * 03.DetachedCriteria自身可以作为一个参数 * * 薪水 大于 平均值的员工信息 */ @Test public  void test16(){ //得到DetachedCriteria对象
        DetachedCriteria criteria= DetachedCriteria.forClass(Emp.class) .setProjection(Projections.avg(“salary”)); //执行查询
        double  avg=(double) criteria.getExecutableCriteria(session).uniqueResult(); System.out.println(“薪水的平均值是:”+avg); //薪水 大于 平均值的员工信息
        List<Emp> list = session.createCriteria(Emp.class).add( Property.forName(“salary”).gt(criteria)).list(); for (Emp emp : list) { System.out.println(emp); } } }

原创文章,作者:Maggie-Hunter,如若转载,请注明出处:https://blog.ytso.com/12109.html

(0)
上一篇 2021年7月19日
下一篇 2021年7月19日

相关推荐

发表回复

登录后才能评论