Criteria查詢


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支持連接查詢,主要是左外連接和內連接
 
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM