歡迎瀏覽Java工程師SSH教程從零打造在線網盤系統系列教程,本系列教程將會使用SSH(Struts2+Spring+Hibernate)打造一個在線網盤系統,本系列教程是從零開始,因此會詳細以及着重地闡述SSH三個框架的基礎知識,第四部分將會進入項目實戰,若是您已經對SSH框架有所掌握,那麼能夠直接瀏覽第四章,源碼均提供在GitHub/ssh-network-hard-disk上供你們參閱html
在前面兩篇文章中咱們基本會使用Hibernate操做數據庫,可是基本都是使用的是Session接口進行操做,像這種根據索引進行檢索數據庫侷限性很是大.爲此Hibernate提供了很強大的查詢技術,例如標準查詢API,QBE,HQL,SQL等git
要想使用標準查詢API就要用到Hibernate的org.hibernate.Criteria接口,經過Session.createCriteria既能夠建立Criteria對象github
public static void main(String[] args) { Session session = HibernateSessionFactory.getSession(); Criteria criteria = session.createCriteria(Product.class); criteria.setMaxResults(2); List list = criteria.list(); for (Object var : list) { System.out.print(var.toString()); } session.close(); }
在使用標準API進行查詢的時候增長約束條件是一個SimpleExpression對象,由org.hibernate.criterion.Restrictions類的靜態方法能夠得到相應的SimpleExpression對象.sql
criteria.add(Restrictions.eq("name", "中藥"));
咱們一樣能夠進行模糊匹配數據庫
criteria.add(Restrictions.like("name", "%中%"));
使用MatchMode類靜態常量,模糊匹配咱們也能夠這樣也是同樣的api
criteria.add(Restrictions.like("name", "中", MatchMode.ANYWHERE));
在增長查詢的約束條件的時候咱們會這樣使用,查詢成績大於90的學生而且是女生,或者怎麼怎麼樣....,咱們可使用LogicalExpression改變他們的邏輯session
public static void main(String[] args) { Session session = HibernateSessionFactory.getSession(); Criteria criteria = session.createCriteria(Product.class); SimpleExpression id1 = Restrictions.eq("id", 1); SimpleExpression id11 = Restrictions.eq("id", 11); LogicalExpression logicalExpression = Restrictions.or(id1, id11); criteria.add(logicalExpression); List list = criteria.list(); for (Object var : list) { System.out.print(var.toString()); } session.close(); }
能夠看到使用LogicalExpression邏輯變得很是臃腫,Hibernate提供了更便捷的解決方案,那就是使用Conjunction生成And關係,使用Disjunction生成or關係框架
Disjunction disjunction = Restrictions.disjunction(); disjunction.add(id1); disjunction.add(id11); criteria.add(disjunction);
Conjunction conjunction = Restrictions.conjunction(); conjunction.add(id1); conjunction.add(id11); criteria.add(conjunction);
那麼如何使用標準查詢API進行分頁查詢呢?得益於Hibernate對不一樣數據庫的封裝,咱們能夠很便捷地進行分頁,例如xxxxx limit0, 10這樣的SQL咱們平時常常見到,咱們可使用Criteria接口兩條語句便可實現分頁功能ssh
criteria.setFirstResult(0); criteria.setMaxResults(10);
您閱讀到這裏的時候能夠發現Criteria接口返回的都是List對象,若是咱們知道一條索引id,咱們根絕這個id去進行去進行查找,就不必返回給我一個List集合了吧? 一樣咱們可使用uniqueResult方法返回一個Object對象學習
Session session = HibernateSessionFactory.getSession(); Criteria criteria = session.createCriteria(Product.class); criteria.add(Restrictions.eq("id",1)); Product product = (Product) criteria.uniqueResult();
在處理多個實體Bean關聯的狀況下咱們須要處理多個Criteria之間的關聯,咱們能夠經過Criteria建立另外一個Criteria對象,參數是一個屬性名
Session session = HibernateSessionFactory.getSession(); Criteria productCriteria = session.createCriteria(Product.class); Criteria productDetailCriteria = productCriteria.createCriteria("productDetail"); productDetailCriteria.add(Restrictions.eq("detatil", "確定匹配不到我")); List list = productCriteria.list();
咱們可使用AggregateProjection類進行聚合操做查詢,例如查詢一個表中的記錄數
public static void main(String[] args) { Session session = HibernateSessionFactory.getSession(); Criteria criteria = session.createCriteria(Product.class); criteria.setProjection(Projections.rowCount()); Long count = (Long) criteria.uniqueResult(); }
除了使用標準查詢API,咱們還可使用QBE進行查詢
public static void main(String[] args) { Session session = HibernateSessionFactory.getSession(); Criteria criteria = session.createCriteria(Product.class); Product product = new Product(); product.setName("中藥"); criteria.add(Example.create(product)); List list = criteria.list(); }
HQL是Hibernate框架提供的另外一種操做數據的方式,其語法很是接近SQL,但倒是面向對象的也就是說HQL所操做的都是持久化對象,而不是數據表
public static void main(String[] args) { Session session = HibernateSessionFactory.getSession(); Query from_product = session.createQuery("from Product"); List list = from_product.list(); }
咱們在進行復雜的查詢HQL都是遊刃有餘的
public static void main(String[] args) { Session session = HibernateSessionFactory.getSession(); Query from_product = session.createQuery("select name from Product where id >0 or id<10"); List list = from_product.list(); }
HQL和JDBC同樣是支持佔位符查詢的
public static void main(String[] args) { Session session = HibernateSessionFactory.getSession(); Query from_product = session.createQuery("select name from Product where id > :id"); from_product.setInteger("id", 0); List list = from_product.list(); }
HQL進行分頁查詢跟標準查詢API非常類似
public static void main(String[] args) { Session session = HibernateSessionFactory.getSession(); Query from_product = session.createQuery("from Product"); from_product.setFirstResult(0); from_product.setMaxResults(10); List list = from_product.list(); }
HQL一樣支持聚合查詢
public static void main(String[] args) { Session session = HibernateSessionFactory.getSession(); Query from_product = session.createQuery("select count(*) from Product"); Long count = (Long) from_product.uniqueResult(); }
HQL做爲一種查詢語言一樣支持Update/Delete/Insert
Query from_product = session.createQuery("xxxxxxx"); from_product.executeUpdate();
雖然HQL能夠完成大多數的操做,可是HQL並不支持數據庫的全部特性,所以在須要的時候咱們仍是須要直接使用SQL操做數據庫
public static void main(String[] args) { Session session = HibernateSessionFactory.getSession(); NativeQuery sqlQuery = session.createSQLQuery("select * from products p"); sqlQuery.addEntity("p", Product.class); List<Product> list = sqlQuery.list(); }
掌握Hibernate的查詢與更新技術,能在Hibernate框架的任意場景中熟練運用各類查詢與更新技術