Hibernate的三種查詢方式
1.HQL (Hibernate Query Lanuage) 語句,這是類似SQL語句的一種對象化查詢語句.
2.使用Criteria對象,進行按條件查詢(Query by Criteria,簡稱QBC)和按示例查詢(Query by Example 簡稱QBE).
3.生成原生的sql(Native SQL)語句.
Criteria的基本使用
- 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() 獲取滿足查詢條件的唯一記錄
對查詢結果進行排序
- 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();
實現分頁顯示數據
- <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>
只查詢一條記錄
- 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類
<----------------------------------------------------------------------------------------------------------->
條件"或"方式組合查詢條件
- 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語句設定查詢條件
- 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()
統計函數查詢
- 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);
統計函數組合查詢條件
- 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);
獲取多個統計函數的值
- 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();
分組查詢
- Transaction tx = session.beginTransaction();
- Criteria criteria=session.createCriteria(Testbook.class);
- criteria.setProjection(Projections.groupProperty("price"));
- List<Double> list=criteria.list();
- tx.commit();
分組統計
- 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();
投影查詢
在一個表中有很多個字段,投影查詢只是查詢某一個或多個字段,也稱局部查詢
- 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()方法實現分組統計
- 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對象實現離線查詢
- //在表現層,構造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中的條件
- 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();