1.Criteria介紹
Criteria與Session綁定,其生命周期跟隨着Session結束而結束,使用Criteria時進行查詢時,每次都要於執行時期動態建立物件,並加入各種查詢條件,隨着Session的回收,Criteria也跟着回收。
org.hibernate.Criteria實際上是個條件附加的容器,如果想要設定查詢條件,則要使用org.hibernate.criterion.Restrictions的各種靜態方法傳回org.hibernate.criterion.Criteria實例,傳回的每個org.hibernate.criterion.Criteria實例代表着一個條件。
2.Criterion介紹
Criterion 是 Criteria 的查詢條件。Criteria 提供了 add(Criterion criterion) 方法來添加查詢條件。Criterion 的實例可以通過 Restrictions 工具類來創建,Restrictions 提供了大量的靜態方法,如 eq (等於)、 ge (大於等於)、 between 等來方法的創建 Criterion 查詢條件。除此之外, Restrictions 還提供了方法來創建 conjunction 和disjunction 實例,通過往該實例的 add(Criteria) 方法來增加查詢條件形成一個查詢條件集合。
3.Restrictions的幾個常用限定查詢方法如下表所示:
Restrictions.eq --> equal,等於.
Restrictions.allEq --> 參數為Map對象,使用key/value進行多個等於的比對,相當於多個Restrictions.eq 的效果
Restrictions.gt --> great-than > 大於
Restrictions.ge --> great-equal >= 大於等於
Restrictions.lt --> less-than, < 小於
Restrictions.le --> less-equal <= 小於等於
Restrictions.between --> 對應SQL的between子句
Restrictions.like --> 對應SQL的LIKE子句
Restrictions.in --> 對應SQL的in子句
Restrictions.and --> and 關系
Restrictions.or --> or 關系
Restrictions.isNull --> 判斷屬性是否為空,為空則返回true 相當於SQL的 is null
Restrictions.isNotNull --> 與isNull相反 相當於SQL的 is not null
Restrictions.sqlRestriction --> SQL限定的查詢
Order.asc --> 根據傳入的字段進行升序排序
Order.desc --> 根據傳入的字段進行降序排序
MatchMode.EXACT --> 字符串精確匹配.相當於"like 'value'"
MatchMode.ANYWHERE --> 字符串在中間匹配.相當於"like '%value%'"
MatchMode.START --> 字符串在最前面的位置.相當於"like 'value%'"
MatchMode.END --> 字符串在最后面的位置.相當於"like '%value'"
4.實例應用
(1)多個條件("與"的方式進行查詢)
//利用hibernate對數據庫中的StudentEntity表進行查詢,將查詢結果放入一個集合返回 public static List<StudentEntity> queryStudentByUserInput(String studentname, String realAddress, String riskrank){ //1.創建一個session對象 Session session1=HibernateTools.getSession(); //2.通過session的createCriteria創建一個Criteria 對象 Criteria criteria=session1.createCriteria(StudentEntity.class); //3. Criteria.add 增加約束(連續加入兩個條件,達到"與"的效果),Restrictions.like()方法中的參數1為數據庫表的實體類的成員變量,參數2為篩選內容,參數3為匹配方式 criteria.add(Restrictions.like("name",studentname,MatchMode.ANYWHERE)) .add(Restrictions.like("address","天",MatchMode.ANYWHERE)); //4.調用list()方法返回查詢結果的集合 List<StudentEntity> studentinfolist=criteria.list(); //開啟一個新的事務Transaction session1.beginTransaction(); //提交事務,此處才是真正與數據庫交互的語句 session1.getTransaction().commit(); HibernateTools.closeSession(); return studentinfolist; }
(2)多個條件("或"的方式進行查詢)
//利用hibernate對數據庫中的StudentEntity表進行查詢,將查詢結果放入一個集合返回 public static List<StudentEntity> queryStudentByUserInput(String studentname, String realAddress, String riskrank){ //1.創建一個session對象 Session session1=HibernateTools.getSession(); //2.通過session的createCriteria創建一個Criteria 對象 Criteria criteria=session1.createCriteria(StudentEntity.class); //3. Criteria.add 增加約束(連續加入兩個條件,達到"或"的效果)[篩選條件為:name屬性中有"l"的,或address屬性中有"天"或"金"] criteria.add(Restrictions.or(Restrictions.like("name", "l",MatchMode.ANYWHERE), Restrictions.or(Restrictions.like("address", "天",MatchMode.ANYWHERE),Restrictions.like("address", "金",MatchMode.ANYWHERE)))); //4.調用list()方法返回查詢結果的集合 List<StudentEntity> studentinfolist=criteria.list(); //開啟一個新的事務Transaction session1.beginTransaction(); //提交事務,此處才是真正與數據庫交互的語句 session1.getTransaction().commit(); HibernateTools.closeSession(); return studentinfolist; }
參考文獻:https://my.oschina.net/u/2266102/blog/425601(極具參考價值)