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);
}
}
}
hibernate11--Criteria查詢