一、Hibernate提供了5種檢索對象的方式
1.導航對象圖檢索方式:根據已經加載的對象導航到其他對象 from Emp e group by e.dept.deptName
2.OID檢索方式:按照對象的OID來檢索對象 get/load
3.HQL檢索方式:使用面向對象的HQL查詢語言
4.QBC檢索方式:使用QBC(Query By Criteria)API來檢索對象,這種API封裝了基於字符串形式的查詢語句,提供了更加面向對象的查詢接口
5.本地SQL檢索方式:使用本地數據庫的SQL查詢語句 createSqlQuery();
二、什么是Criteria查詢(使用QBC(Query By Criteria)API來檢索對象)
解析:Criteria查詢是Hibernate提供的另一種查詢方式。
主要由Criteria、Criterion接口和Restrictions類組成,他支持在運行時動態生成查詢語句。
三、實例來講解Criteria的用法。
(一)首先我們我們先來熟悉一下createCriteria()方法
Criteria criteria = session.createCriteria(Emp.class);
解析:使用session.createCriteria()方法創建了criteria對象,createCriteria()方法的參數是持久化類的類型。
List<Emp> list = criteria.list();
解析:使用criteria.list()執行查詢語句,list()方法返回List集合。
@Test //1.查詢所有部分信息 public void SelectPartMessage(){ Session session = HibernateUtil.currentSession(); Transaction tx = session.beginTransaction(); Criteria criteria = session.createCriteria(Emp.class); List<Emp> list = criteria.list(); for (Emp dept : list) { System.out.println(dept.getEmpName()); } tx.commit(); }
(二)根據條件查詢
1)比較運算符
HQL運算符 | Criteria運算方法 | 說明 |
= | SimpleExpression Restrictions.eq(String propertyName,Object value) | 等於 |
<> | SimpleExpression Restrictions.ne(String propertyName,Object value) | 不等於 |
> | SimpleExpression Restrictions.gt(String propertyName,Object value) | 大於 |
>= | SimpleExpression Restrictions.ge(String propertyName,Object value) | 大於等於 |
< | SimpleExpression Restrictions.lt(String propertyName,Object value) | 小於 |
<= | SimpleExpression Restrictions.le(String propertyName,Object value) | 小於等於 |
is null | Criteria Restrictions.isNull(String propertyName) | 等於空值 |
is not null | Criteria Restrictions.isNotNull(String propertyName) | 非空值 |
Criterion eq = Restrictions.eq("empName", "微冷的雨");
解析: Restrictions其方法的返回值是Criterion類型
@Test //按條件查詢 public void HasMessage(){ Session session = HibernateUtil.currentSession(); Transaction tx = session.beginTransaction(); Criteria criteria = session.createCriteria(Emp.class); Criterion eq = Restrictions.eq("empName", "微冷的雨"); criteria=criteria.add(eq); List<Emp> list=criteria.list(); for(Emp emps:list){ System.out.println(emps.getEmpName()); } }
criteria.createAlias("dept", "d"); 解析:查看部門下的員工,用createAlias()方法獲取其部門的屬性值(必須起方法才能獲取部門屬性值);dept(在關聯emp的屬性值在emp定義多對一關聯)d是別名
Criterion criterion = Restrictions.eq("d.deptName", "開發部");
解析:d.deptName獲取屬性值
/** * 1.3 關聯查詢 查詢“開發部”所有員工 * */ @Test public void connectTest(){ Session session = HibernateUtil.currentSession(); Transaction tx = session.beginTransaction(); Criteria criteria = session.createCriteria(Emp.class); //Emp中關聯的dept對象,起一個別名 d criteria.createAlias("dept", "d"); Criterion criterion = Restrictions.eq("d.deptName", "開發部"); criteria.add(criterion); List<Emp> list = criteria.list(); for (Emp emp : list) { System.out.println(emp.getEmpName()); } }
2)范圍運算符
HQL運算符 | Criteria運算方法 | 說明 |
in(列表) | Criterion Restrictions.in(String propertyName,Collecyion values) 或者 Criterion Restrictions.in(String propertyName,Object[] values) |
等於類表中的某一個值 |
not in(列表) | Criterion Restrictions.not( Restrictions.in()) | 不等於列表中的任意一個值 |
between 值1 and 值2 | Criterion Restrictions.between(String propertyName,Object lo,Object hi) | 大於等於值1 並且小於等於值2 |
not between 值1 and 值2 | Criterion Restrictions.not(Restrictions.between()) | 小於值1 或者大於值2 |
lists.add("bj"); Criterion criterion=Restrictions.in("empCtity", lists);
解析:empCtity為bj的員工
//1.4查詢地址為bj的員工信息 @Test public void hastable(){ Session session = HibernateUtil.currentSession(); Transaction tx = session.beginTransaction(); Criteria criteria = session.createCriteria(Emp.class); List<String> lists=new ArrayList<String>(); lists.add("bj"); Criterion criterion=Restrictions.in("empCtity", lists); criteria.add(criterion); List<Emp> list = criteria.list(); for (Emp emp : list) { System.out.println(emp.getEmpName()); } }
3)字符串模式匹配
Criterion criterion = Restrictions.ilike("empCtity", "%b%");
解析:Restrictions.ilike()字符串模型匹配同時忽略大小寫(有i)
解析:Restrictions.like()字符串模型匹配
/** * 1.5 字符串模式匹配 * 查詢員工地址中包含“s”的所有員工,忽略大小寫 Restrictions.ilike( ) //Ignore Like */ @Test public void likeTest(){ Session session = HibernateUtil.currentSession(); Transaction tx = session.beginTransaction(); Criteria criteria = session.createCriteria(Emp.class); Criterion criterion = Restrictions.ilike("empCtity", "%b%"); criteria.add(criterion); List<Emp> list = criteria.list(); for (Emp emp : list) { System.out.println(emp.getEmpName()); } }
4)邏輯運算符
解釋有and邏輯與 or邏輯或 not邏輯非
Criterion criterion = Restrictions.and(c1, c2);
解析:將兩個參數傳入
/** * 1.6 邏輯運算 * and 過濾 查找地址是bj 並且 名稱中包含 “雨” 的員工信息 */ @Test public void logicTest(){ Session session = HibernateUtil.currentSession(); Transaction tx = session.beginTransaction(); Criteria criteria= session.createCriteria(Emp.class); Criterion c1 = Restrictions.eq("empCtity", "bj"); Criterion c2= Restrictions.like("empName", "號",MatchMode.ANYWHERE); Criterion criterion = Restrictions.and(c1, c2); criteria.add(criterion); List<Emp> list = criteria.list(); for (Emp emp : list) { System.out.println(emp.getEmpName()); } }
5)集和運算
Criterion criterion = Restrictions.isEmpty("emps");
解析:Restrictions.isEmpty()集合為空,不包括任何元素
/** * 1.7 集合運算 * 集合運算 查詢 沒有員工的部門 * */ @Test public void collectionTest(){ Session session = HibernateUtil.currentSession(); Transaction tx = session.beginTransaction(); Criteria criteria = session.createCriteria(Dept.class); //Restrictions類方法的返回值是Criterion Criterion criterion = Restrictions.isEmpty("emps"); criteria.add(criterion); List<Dept> list = criteria.list(); for (Dept dept : list) { System.out.println(dept.getDeptName()); } }
(三)動態查詢
解析:動態查詢就是根據條件進行sql語句的拼接
/** * 1.8 動態查詢 * 如何查找出符合以下條件的員工信息: 職位是工程師,如:job = ‘engineer’ 工資大於2000元,如:salary > 2000 入職時間在2006年12月31日至2008年12月31日之間 如何查找出符合以下條件的員工信息: 地址 = ‘bj’ 員工編號大於0 * * */ @Test public void dynamicTest(){ Session session = HibernateUtil.currentSession(); Transaction tx = session.beginTransaction(); Criteria criteria = session.createCriteria(Emp.class); //00.構建出一個和page對應的條件類,依次判定條件是否為空 EmpCondition condition=new EmpCondition(); condition.setEmpCity("bj"); condition.setEmpId(0); //1.2判定之后,動態拼接檢索條件 if (condition.getEmpCity()!=null) { //用戶填寫了地址作為檢索條件 criteria.add(Restrictions.eq("empCtity", condition.getEmpCity())); } if(condition.getEmpId()!=null){ //用戶填寫用戶編號作為篩選條件 criteria.add(Restrictions.gt("empId", condition.getEmpId())); } List<Emp> list = criteria.list(); for (Emp emp : list) { System.out.println(emp.getEmpName()); } }
(四)Order排序
/** * 1.9 排序 addOrder() * 查詢工號大於0的員工,查詢結果按員工 編號升序排列 * */ @Test public void orderTest(){ Session session = HibernateUtil.currentSession(); Transaction tx = session.beginTransaction(); Criteria criteria = session.createCriteria(Emp.class); Criterion criterion = Restrictions.gt("empId", 0); criteria.add(criterion).addOrder(Order.asc("empId")); List<Emp> list = criteria.list(); for (Emp emp : list) { System.out.println(emp.getEmpName()); } }
(五)分頁
/** * 1.10 分頁 * Criteria接口提供了設置分頁的方法 setFirstResult(int firstResult) 起始記錄的索引 setMaxResult(int maxResult) 最大記錄條數 //10.分頁 查詢員工表中的4-6條數據,每頁3條數據 */ @Test public void pageListTest(){ Session session = HibernateUtil.currentSession(); Transaction tx = session.beginTransaction(); Criteria criteria = session.createCriteria(Emp.class); //總記錄數 Projection projection = Projections.count("empId"); criteria.setProjection(projection); Integer count = ((Long)criteria.uniqueResult()).intValue(); System.out.println(count); //分頁 int pageSize=3; int pageIndex=2; criteria.setFirstResult((pageIndex-1)*pageSize); criteria.setMaxResults(pageSize); List<Emp> list = criteria.list(); for (Emp emp : list) { System.out.println(emp.getEmpName()); } }
(六)DetachedCriteria
/** * 1.11 DetachedCriteria和Criteria功能類似,它實現了CriteriaSpecification接口 Criteria是由Session對象創建的 DetachedCriteria創建時不需要Session對象 使用DetachedCriteria來構造查詢條件 可以把DetachedCriteria作為方法參數傳遞給業務層 * 查詢開發部的員工 * */ @Test public void detachedCriteriaTest(){ Session session = HibernateUtil.currentSession(); Transaction tx = session.beginTransaction(); //構建一個DetachedCriteria對象 DetachedCriteria detachedCriteria=DetachedCriteria.forClass(Emp.class); //別名 detachedCriteria.createAlias("dept","d"); //檢索條件 Criterion criterion = Restrictions.eq("d.deptName", "開發部"); //綁定 detachedCriteria.add(criterion); List<Emp> list = detachedCriteria.getExecutableCriteria(session).list(); for (Emp emp : list) { System.out.println(emp.getEmpName()); } }
就此講解到此,希望程序員的我們有收獲!!!!友情提示HibernateUtil工具類
package cn.happy.until; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.cfg.Configuration; /** * 工具類 * @author happy * */ public class HibernateUtil { //getCurrentSession()底層實現原理 //ThreadLocal變量 public static final ThreadLocal<Session> threadTL=new ThreadLocal<Session>(); //我想直接調用一個方法,獲取Session //定義一個sessionFactory對象 private static SessionFactory factory; private static Configuration cfg; static{ cfg=new Configuration().configure(); factory=cfg.buildSessionFactory(); } //提供一個靜態方法 public static Session currentSession(){ Session session=threadTL.get(); if(session==null){ //當前線程中沒有session對象 session=factory.openSession(); threadTL.set(session); } return session; } //關閉session public static void closeSession(){ //獲取線程中的session Session session = threadTL.get(); if (session!=null) { threadTL.set(null); session.close(); } } }