1. 程式人生 > >Hibernate查詢資料庫的三種方式

Hibernate查詢資料庫的三種方式

說到使用Hibernate框架查詢資料,最常用的就是使用HQL(HibernateQueryLanguage)語句了,或者使用原生態的SQL(Native SQL Query )語句,這就包括兩種了,那麼第三種是什麼呢?
是他是他就是他—Criteria [kraɪ’tɪrɪə] Query 條件查詢 (不好讀啊!)
進行按條件查詢(Query by Criteria,簡稱QBC)和按示例查詢(Query by Example 簡稱QBE).
Criteria的基本使用
Java程式碼 收藏程式碼

    Transaction tx = session.beginTransaction
(); Criteria criteria = session.createCriteria(Testbook.class); List<Testbook> list=criteria.list(); tx.commit();

查詢Testbook 中所有的資料,然後返回
Criteria 介面的核心方法
add() 增加一個代表查詢條件的Criterion物件
addOrder() 增加一個代表排序的Criterion物件
createAlias() 建立關聯查詢,為所關聯的持久化類建立別名
createCriteria() 在相互關聯的持久化類之間建立條件約束
setFirstResult() 設定要獲取的第一條記錄的位置
setMaxResults() 設定要獲取的記錄的最大數量
list() 獲取滿足查詢條件的記錄的集合
uniqueResult() 獲取滿足查詢條件的唯一記錄

對查詢結果進行排序
Java程式碼 收藏程式碼

Transaction tx = session.beginTransaction();  
Criteria criteria = session.createCriteria(Testbook.class).add(  
Restrictions.like("name","任%")).add(Restrictions.between("id",1000,1010));  
criteria.addOrder(Order.desc("id")).addOrder(Order.asc("createdTime"));  
List<Testbook> list=criteria.list();  
tx.commit();  

實現分頁顯示資料

Java程式碼 收藏程式碼

<span style="font-size: x-small;">Transaction tx = session.beginTransaction();  
Criteria criteria = session.createCriteria(Testbook.class).add(  
Restrictions.like("name","任%"));  
criteria.addOrder(Order.desc("id"));  
criteria.setMaxResults(30);  
criteria.setFirstResult(10);//setFirstResult()從0開始計數  
List<Testbook> list=criteria.list();  
tx.commit();</span>  

只查詢一條記錄
Java程式碼 收藏程式碼

Transaction tx = session.beginTransaction();  
Criteria criteria = session.createCriteria(Testbook.class).add(  
Restrictions.like("name","任%"));  
criteria.addOrder(Order.desc("id"));  
criteria.setMaxResults(1);  
Testbook tb=(Testbook)criteria.uniqueResult();  
tx.commit();  

Restrictions類

<———————————————————————————————————–>

條件”或”方式組合查詢條件

Java程式碼 收藏程式碼

Transaction tx = session.beginTransaction();  
Criteria criteria=session.createCriteria(Testbook.class);  
Criterion criterion1=Restrictions.or(Restrictions.like("name","任%"),  
Restrictions.between("id",1000,1010));  
criteria.add(criterion1);  
List<Testbook> list=criteria.list();  
tx.commit();  

使用原生SQL語句設定查詢條件
Java程式碼 收藏程式碼

Transaction tx = session.beginTransaction();  
Criteria criteria=session.createCriteria(Testbook.class);  
criteria.add(Restrictions.sqlRestriction("{alias}.name=?","Narcissus",Hibernate.STRING));  
List<Testbook> list=criteria.list();  
tx.commit()  

統計函式查詢

Java程式碼 收藏程式碼

Transaction tx = session.beginTransaction();  
Criteria criteria=session.createCriteria(Testbook.class);  
criteria.setProjection(Projections.max("price"));  
Double maxValue=(Double)criteria.uniqueResult();  
tx.commit();  
System.out.println(maxValue);  

統計函式組合查詢條件
Java程式碼 收藏程式碼

Transaction tx = session.beginTransaction();  
Criteria criteria=session.createCriteria(Testbook.class);  
criteria.setProjection(Projections.max("price"));  
Double maxValue=(Double)criteria.uniqueResult();  
tx.commit();  
System.out.println(maxValue);  

獲取多個統計函式的值

Java程式碼 收藏程式碼

Transaction tx = session.beginTransaction();  
Criteria criteria=session.createCriteria(Testbook.class);  
ProjectionList proList=Projections.projectionList();  
proList.add(Projections.max("price"));  
proList.add(Projections.min("price"));  
proList.add(Projections.avg("price"));  
proList.add(Projections.sum("price"));  
proList.add(Projections.count("price"));  
proList.add(Projections.countDistinct("price"));  
proList.add(Projections.rowCount());  
criteria.setProjection(proList);  
Object values[]=(Object[])criteria.uniqueResult();  
tx.commit();  

分組查詢
Java程式碼 收藏程式碼

Transaction tx = session.beginTransaction();  
Criteria criteria=session.createCriteria(Testbook.class);  
criteria.setProjection(Projections.groupProperty("price"));  
List<Double> list=criteria.list();  
tx.commit();  

分組統計

Java程式碼 收藏程式碼

Transaction tx = session.beginTransaction();  
Criteria criteria=session.createCriteria(Testbook.class);  
ProjectionList proList=Projections.projectionList();  
proList.add(Projections.rowCount());//商品的個數  
proList.add(Projections.sum("price"));  
proList.add(Projections.groupProperty("name"));  
criteria.setProjection(proList);  
List<Double> list=criteria.list();  
tx.commit();  

投影查詢
在一個表中有很多個欄位,投影查詢只是查詢某一個或多個欄位,也稱區域性查詢

Java程式碼 收藏程式碼

Transaction tx = session.beginTransaction();  
Criteria criteria=session.createCriteria(Testbook.class);  
criteria.setProjection(Property.forName("price"));  
criteria.add(Restrictions.gt("price",new Double(40.0)))  
List<Double> list=criteria.list();  
tx.commit();  

使用Property類的forName()方法實現分組統計

Java程式碼 收藏程式碼

Transaction tx = session.beginTransaction();  
Criteria criteria=session.createCriteria(Testbook.class);  
ProjectionList proList=Projections.projectionList();  
proList.add(Projections.forName("price").max());  
proList.add(Projections.forName("price").min());  
proList.add(Projections.forName("price").avg());  
proList.add(Projections.forName("category.id").group().as("c"));  
criteria.setProjection(proList);  
criteria.addOrder(Order.desc("c"));  
List<Object[]> list=criteria.list();  
tx.commit();  

使用DetachedCriteria物件實現離線查詢

Java程式碼 收藏程式碼

//在表現層,構造DetachedCriteria物件,儲存使用者動態的查詢條件  
DetachedCriteria detchedCriteria=DetachedCriteria.forClass(Testbook.class);  
detchedCriteria.add(Restrictions.like("name","任%")).add(Restrictions.between("id",new Integer(1),new Integer(10)));  
detchedCriteria.addOrder(Order.desc("id"));  

//在業務邏輯層,DetachedCriteria物件與當前的Session物件進行繫結,獲取查詢結果  
Session session=HibernateSessionFactoryUtil.getSessionFactory().getCurrentSession();  
Transaction tx=detchedCriteria.getExecutableCriteria(session);  
List<Testbook> list=criteria.list();  
tx.commit();  

根據示例物件進行查詢

先定義一個模板然後把這個模板的樣式傳進去,查詢,例如這裡定義的Testbook中的名字為Narcissus的欄位,進行查詢,條件可以為一個也可以為多個,對應的就是where中的條件

Java程式碼 收藏程式碼

Testbook tb=new Testbook();  
tb.setName("Narcissus");  
Session session=HibernateSessionFactoryUtil.getSessionFactory().getCurrentSession();  
Transaction tx = session.beginTransaction();  
Criteria criteria=session.createCriteria(Testbook.class);  
Criteria.add(Example.creaate(tb));  
List<Testbook> list=criteria.list();  
tx.commit();