1、使用Criteria查詢數據
Criteria查詢是Hibernate提供的一種查詢方式
2、設定查詢條件(Restrictions)
比較運算
Restrictions.eq( )
范圍運算
Restrictions.in( )
字符串模式匹配
Restrictions.ilike( )/like( )
邏輯運算
Restrictions.or( )
集合運算
Restrictions.isEmpty( )
示例代碼:
public List findByCriteria(Object[] arg) {
return HibernateSessionFactory.getSession()
.createCriteria(Users.class)
// and
.add(Restrictions.eq("id", 1014))
.add(Restrictions.eq("password", 123))
// 與條件
// or
.add(Restrictions.or(Restrictions.eq("id", 1014),
Restrictions.eq("password", 123)))
// 或條件兩個之間
.add(Restrictions.disjunction()
.add(Restrictions.eq("id", 1014))
.add(Restrictions.eq("name", "小明")))
// 各種條件
.add(Restrictions.between("id", "1000", "1020"))
.add(Restrictions.like("name", "李"))
.add(Restrictions.ilike("name", "李"))
// 不區分大小寫
.add(Restrictions.ilike("name", "李", MatchMode.START))
// 在開頭MatchMode.START 在結尾MatchMode.END 任何地方MatchMode.ANYWHERE、嚴格匹配MatchMode.EXACT
.add(Restrictions.in("id", arg))
.add(Restrictions.isEmpty("house"))// 是空Users.house
.add(Restrictions.not(Restrictions.isEmpty("house")))// 取反
.add(Restrictions.isNull("name"))// 為空
.add(Restrictions.isNotNull("name"))// 為空
.add(Restrictions.sizeEq("house", 5))// ge gt le lt
.add(Restrictions.ne("id", 5))// id 不等於5
.add(Restrictions.eqProperty("入職時間", "生日時間"))// 自己的屬性比較
.add(Restrictions.ge("id", 5))// id大於等於5
.add(Restrictions.geProperty("", ""))// 屬性之間的比較 后面大於等於前面
.add(Restrictions.neProperty("", ""))// 屬性之間比較不相等
.addOrder(Order.asc(""))//排序升序
.list();
}
3、動態查詢
public List<Users> test(Map<String, Object> arg) {
Criteria c = HibernateSessionFactory.getSession().createCriteria(Users.class);
// .add(Restri1ctions.ge("id", arg.get("id")))
if (arg.get("start") != null || arg.get("end") != null)
c.add(Restrictions.between("id", arg.get("start"), arg.get("end")));
if (arg.get("name") != null)
c.add(Restrictions.eq("name", arg.get("name")));
return c.list();
}
4、排序
Criteria查詢使用org.hibernate.criterion.Order類對查詢結果排序
5、分頁
Criteria接口提供了設置分頁的方法
setFirstResult(int firstResult)
setMaxResult(int maxResult)
6、查詢唯一對象

Emp emp = (Emp) session.createCriteria(Emp.class)
.add(Restrictions.isNotNull("salary"))
.addOrder(Order.desc("salary"))
.setMaxResults(1)
.uniqueResult();
7、關聯
Criteria接口提供了createCriteria()和createAlias()方法建立內連接
List<Emp> list = session.createCriteria(Emp.class)
.add(Restrictions.ilike("empName", "a", MatchMode.ANYWHERE))
.createCriteria("dept")
.add(Restrictions.eq("deptName", "財務部").ignoreCase()) .list();
List<Emp> list = session.createCriteria(Emp.class, "e")
.createAlias("dept ", "d")
.add(Restrictions.ilike("e.empName", "a",
MatchMode.ANYWHERE))
.add(Restrictions.eq("d.deptName", "財務部").ignoreCa
se()).list();
8、投影
Hibernate提供了org.hibernate.criterion.Projection接口和org.hibernate.criterion.Projections類來支持Criteria投影
List<String> list = session.createCriteria(Dept.class)
.setProjection(Property.forName("dname")).list();
List<Object[]> list = session.createCriteria(Emp.class)
.setProjection(
Projections.projectionList()
.add(Property.forName("ename"))
.add(Property.forName("hiredate"))
).list();
/**查詢所有房屋信息,投影查詢只要title和ID屬性*/
public List<Object[]> findHouseByCriteria4(){
return HibernateSessionFactory.getSession()
.createCriteria(House.class,"h")
.setProjection(Projections.projectionList()
/*.add(Property.forName("h.id").count())
.add(Property.forName("h.title"))*/
.add(Projections.count("h.id"))
.add(Property.forName("h.title"))
.add(Projections.rowCount())//==count(*)
)
.list();
}
9、分組
使用Property實現org.hibernate.criterion.Projections類提供了使用聚合函數查詢的方法

10、DetachedCriteria
DetachedCriteria和Criteria功能類似
Criteria是由Session對象創建的,DetachedCriteria創建時不需要Session對象可以把DetachedCriteria作為方法參數傳來構造查詢條件
/**使用DetachedCriteria查詢所有房屋信息*/
public List findHouseUseDetachedCriteria(DetachedCriteria c){
/*Session session=HibernateSessionFactory.getSession();
c.getExecutableCriteria(session).list();*/
return c.getExecutableCriteria(
HibernateSessionFactory.getSession()).list();
}
public void findHouseUseDetachedCriteria(){
Transaction tr = null;
tr = HibernateSessionFactory.getSession().beginTransaction();
List<Object[]> houses =null;
try {
DetachedCriteria c =DetachedCriteria.forClass(House.class,"h")
// .add(Restrictions.like("h.title", "居",MatchMode.END))
.setProjection(Projections.projectionList()
.add(Property.forName("h.price").avg().as("hp"))
.add(Property.forName("h.title")))
.addOrder(Order.asc("hp"));
houses =dao.findHouseUseDetachedCriteria(c);
for(Object[] row:houses){
System.out.println(row[0]+"--"+row[1]);
}
tr.commit();
} catch (HibernateException e) {
e.printStackTrace();
if (tr != null) {
tr.rollback();
}
}
}
11、總結
HQL支持多種連接查詢
Hibernate可以在映射文件中定義查詢語句
Criteria查詢是Hibernate提供的一種查詢方式。
Criteria接口提供的分頁查詢方法和Query接口的相同,主要是setFirstResult()方法和setMaxResult()方法。
Criteria支持連接查詢,主要是左外連接和內連接