Hibernate 導航對象、OID、HQL、QBC、SQL檢索方式

Hibernate的檢索方式

一、導航對象檢索

二、OID檢索

三、HQL檢索

四、QBC檢索

五、SQL檢索:


一、導航對象檢索:

  • 概述:根據已經加載的對象導航到其他的對象。例如可以根據訂單的信息找到客戶的相關信息
Order order = session.get(Order.Class,1l);
Customer customer = order.getCustomer();

二、OID檢索:

  • 概述:利用session的get()、load()方法檢索某條記錄對應的對象
  • get()與load方法的區別:

* get方法
*  * 採用的是立即加載,執行到這行代碼的時候,就會馬上發送SQL語句去查詢。
*  * 查詢後返回是真實對象本身。
*  * 查詢一個找不到的對象的時候,返回null
*
* load方法
*  * 採用的是延遲加載,執行到這行代碼的時候,不會發送SQL語句,當真正使用這個對象的時候纔會發送SQL語句。
*  * 查詢後返回的是代理對象。javassist-3.18.1-GA.jar 利用javassist技術產生的代理。
*  * 查詢一個找不到的對象的時候,返回ObjectNotFoundException

Order order = session.get(Order.Class,1l);
Order order = session.load(Order.Class,1l);

三、HQL檢索:

    概述:面向對象的查詢語言,和SQL語言有些類似,但它使用的是類、對象和屬性,沒有表和字段的概念

1.HQL簡單查詢:

1.1查詢所有的Customer

Query query = session.createQuery("from com.jjxy.hibernate.Customer");
List<Customer> list = query.list();

1.2HQL 別名查詢

Query query = session.createQuery("from com.jjxy.hibernate.Customer c");
或者
Query query = session.createQuery("select c from com.jjxy.hibernate.Customer c");
List<Customer> list = query.list();

2.HQL排序查詢:降序(desc)、默認.....升序(asc),利用關鍵字 order by

Query query = session.createQuery("from Customer order by cust_id desc");
List<Customer> list = query.list();

3.HQL條件查詢:位置綁定、名稱綁定查詢兩種

3.1位置綁定

3.1.1單個條件查詢  

ry = session.createQuery("from Customer where cust_name=?");
query.setParameter(0,"小李")
List<Customer> list = query.list();

3.1.2多個條件查詢 (綁定多個參數,用Query對象的setParameter()方法設置查詢值)

Query query = session.createQuery("from Customer where cust_name=? and cust_source like ?");
query.setParameter(0,"小李");
query.setParameter(1,"微信");
List<Customer> list = query.list();

3.2名稱綁定查詢 

Query query = session.createQuery("from Customer where cust_name= :cust_name and cust_source like:cust_source");
query.setParameter("cust_name","小李");
query.setParameter("cust_source","微信");
List<Customer> list = query.list();

 4. HQL的投影查詢:查詢某個對象的某個或某些屬性

4.1查詢某個屬性 :將它們可以保存在List的Object集合中

List<Object> list = session.createQuery("select c.cust_name from Customer c").list();

4.2查詢多個屬性:多個屬性要保存,可以選擇保存在List的Object數組集合中

List<Object[]> list = session.createQuery("select c.cust_name,c.cust_source from Customer c").list();
for(Object[] object :list){
     System.out.println(Arrays.toString(object));
}

 4.2.1查詢多個屬性封裝到原有的對象中去:查詢哪些屬性就要在實體類中設置其屬性的有參、無參構造方法。

List<Customer> list1 = session.createQuery("select  new Customer(cust_name,cust_source) from Customer").list();
for(Customer customer:list1){
     System.out.println(customer);
}

5.HQL的分頁查詢 :  setFirstResult()、 setMaxResults()

Query query = session.createQuery("from LinkMan");
query.setFirstResult(0);
query.setMaxResults(10);
List<LinkMan> list = query.list();

6.HQL的分頁統計查詢 

6.1統計查詢 :     聚合函數的使用 ........count,max,min,avg,sum

Long l = (Long)session.createQuery("select count(*) from Customer").uniqueResult();
System.out.println(l);

6.2 分組查詢 :group by  (having count(*)>=1)....設置記錄數限制

List<Object[]> objects= session.createQuery("select  cust_source,count (*) from Customer group by cust_source having count(*) >=1").list();
for (Object[] objects1:objects){
     System.out.println(Arrays.toString(objects1));
}

四、QBC檢索

概述:(Query By Criteria),主要由Criteria接口實現

1.QBC簡單查詢

Criteria criteria = session.createCriteria(Customer.class);
List<Customer> list = criteria.list();

 2.排序查詢:addOrader()

Criteria criteria = session.createCriteria(Customer.class);
List<Customer> list = criteria.addOrder(Order.desc("cust_id")).list();

3.分頁查詢

Criteria criteria = session.createCriteria(LinkMan.class);
criteria.setFirstResult(10);
criteria.setMaxResults(10);
List<LinkMan> list = criteria.list();

 4.條件查詢 :add()

       Criteria criteria = session.createCriteria(Customer.class);
        //設置條件
        /*
        *   =    eq
        *   >    gt
        *   >=   ge
        *   <    lt
        *   <=   le
        *   <>   ne
        *   like
        *   in
        *   and
        *   or
        * */
        criteria.add(Restrictions.eq("cust_source","微信"));
        /*設置第二個並列的條件*/
        criteria.add(Restrictions.like("cust_name","%李"));
        List<Customer> list = criteria.list();

5.統計查詢 

Criteria criteria = session.createCriteria(Customer.class);
/*
 *  add   :普通的條件查詢
 *  addOrder  :排序
 *  setProjection :聚合函數
 * */
Long aLong = (Long) criteria.setProjection(Projections.rowCount()).uniqueResult();
System.out.println(aLong);

6.離線查詢  :DetachedCriteria對象

DetachedCriteria detachedCriteria = DetachedCriteria.forClass(Customer.class);
/*模擬業務層傳來的數據*/
detachedCriteria.add(Restrictions.like("cust_name","%李"));
Session session = HibernateUtils.getCurrentSession();
Transaction tx = session.beginTransaction();

Criteria c = detachedCriteria.getExecutableCriteria(session);
List<Customer> list = c.list();
for(Customer customer:list){
    System.out.println(customer);
}
tx.commit();

五、SQL檢索:
1.將查詢的SQLQuery封裝至對象中: ........addEntity()方法

public void demo(){
        Session session = HibernateUtils.getCurrentSession();
        Transaction tx = session.beginTransaction();

        SQLQuery sqlQuery = session.createSQLQuery("select *from cst_customer");
       /* List<Object[]> list = sqlQuery.list();
        for(Object[] objects:list){
            System.out.println(Arrays.toString(objects));
        }*/
        /*將SQLQuery封裝至對象中*/
        sqlQuery.addEntity(Customer.class);
        List<Customer> list = sqlQuery.list();
        for(Customer customer:list){
            System.out.println(customer);
        }
        tx.commit();
    }

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章