【Hibernate筆記整理八】檢索方式

版權聲明:本文爲 小異常 原創文章,非商用自由轉載-保持署名-註明出處,謝謝!
本文網址:https://blog.csdn.net/sun8112133/article/details/106151609







Hibernate 中提供了很多種的檢索方式。下面我們就挨個介紹:


一、OID 檢索

OID 檢索Hibernate 根據對象的 OID(主鍵)進行檢索的一種方式。

1、使用 get() 方法

Customer customer = session.get(Customer.class, 1L);

2、使用 load() 方式

Customer customer = session.load(Customer.class, 1L);


二、對象導航檢索

對象導航檢索是 Hibernate 根據一個已經查詢到的對象,獲得其關聯對象的一種查詢方式。

LinkMan linkMan = session.get(LinkMan.class, 1L);
Customer customer = linkMan.getCustomer();   // 對象導航


三、HQL 檢索(*重要)

HQL 查詢 的全稱是 Hibernate Query Language,它是 Hibernate 的查詢語言,是一種面向對象方式的查詢語言,語法類似 SQL。通過 session.createQuery(),就可以接收到一個 HQL 查詢對象。

1、簡單查詢

@Test
// 簡單查詢
public void demo1() {
    Session session = HibernateUtils.getCurrentSession();
    Transaction tx = session.beginTransaction();

    Query query = session.createQuery("from Customer");
    List<Customer> list = query.list();
    // sql中支持*號的寫法:select * from cst_customer; 但是在HQL中不支持*號的寫法

    for (Customer customer : list) {
        System.out.println(customer);
    }

    tx.commit();
}

2、別名查詢

@Test
// 別名查詢
public void demo2() {
    Session session = HibernateUtils.getCurrentSession();
    Transaction tx = session.beginTransaction();

    //		Query query = session.createQuery("from Customer c");
    Query query = session.createQuery("select c from Customer c");
    List<Customer> list = query.list();
    // sql中支持*號的寫法:select * from cst_customer; 但是在HQL中不支持*號的寫法

    for (Customer customer : list) {
        System.out.println(customer);
    }

    tx.commit();
}

3、排序查詢

@Test
// 排序查詢
public void demo3() {
    Session session = HibernateUtils.getCurrentSession();
    Transaction tx = session.beginTransaction();

    // 默認情況
    //		Query query = session.createQuery("from Customer order by cust_id");
    // 設置降序(升序使用asc,降序使用desc)
    Query query = session.createQuery("from Customer order by cust_id desc");
    List<Customer> list = query.list();

    for (Customer customer : list) {
        System.out.println(customer);
    }

    tx.commit();
}

4、HQL 的條件查詢

@Test
// 條件查詢
public void demo4() {
    Session session = HibernateUtils.getCurrentSession();
    Transaction tx = session.beginTransaction();

    // 條件查詢
    // 一、按位置綁定:根據參數的位置進行綁定
    // 一個條件
    //		Query query = session.createQuery("from Customer where cust_name = ?");
    //		query.setParameter(0, "李四");
    // 多個條件
    //		Query query = session.createQuery("from Customer where cust_source = ? and cust_name like ?");
    //		query.setParameter(0, "電腦");
    //		query.setParameter(1, "李%");

    // 二、按名稱綁定
    Query query = session.createQuery("from Customer where cust_source = :aaa and cust_name like :bbb");
    // 設置參數
    query.setParameter("aaa", "電腦");
    query.setParameter("bbb", "李%");

    List<Customer> list = query.list();
    for (Customer customer : list) {
        System.out.println(customer);
    }

    tx.commit();
}

5、投影查詢

投影查詢 是查詢對象的某個或某些屬性。

@Test
// 投影查詢
public void demo5() {
    Session session = HibernateUtils.getCurrentSession();
    Transaction tx = session.beginTransaction();

    // 投影查詢
    // 單個屬性
    //		Query query = session.createQuery("select c.cust_name from Customer c");
    //		List<Object> list = query.list();
    //		for (Object obj : list) {
    //			System.out.println(obj);
    //		}

    // 多個屬性
    //		Query query = session.createQuery("select c.cust_name, c.cust_source from Customer c");
    //		List<Object[]> list = query.list();
    //		for (Object[] objs : list) {
    //			System.out.println(Arrays.toString(objs));
    //		}

    // 查詢多個屬性,並封裝到對象中
    Query query = session.createQuery("select new Customer(cust_name, cust_source) from Customer");
    List<Customer> list = query.list();
    for (Customer customer : list) {
        System.out.println(customer);
    }

    tx.commit();
}

6、分頁查詢

@Test
// 分頁查詢
public void demo6() {
    Session session = HibernateUtils.getCurrentSession();
    Transaction tx = session.beginTransaction();

    // 分頁查詢
    Query query = session.createQuery("from LinkMan");
    query.setFirstResult(10);  // 從第幾條開始,0是第一條
    query.setMaxResults(10);  // 顯示多少條
    List<LinkMan> list = query.list();
    for (LinkMan linkMan : list) {
        System.out.println(linkMan);
    }

    tx.commit();
}

7、分組統計查詢

@Test
// 分組統計查詢
public void demo7() {
    Session session = HibernateUtils.getCurrentSession();
    Transaction tx = session.beginTransaction();

    // 聚合函數的使用:count(), max(), min(), avg(), sum()
    //		Query query = session.createQuery("select count(*) from Customer");
    //		Object object = query.uniqueResult();   // 唯一結果
    //		System.out.println(object);

    // 分組統計:
    Query query = session.createQuery("select cust_source, count(*) from Customer group by cust_source having count(*) >= 2");
    List<Object[]> list = query.list();
    for (Object[] objs : list) {
        System.out.println(Arrays.toString(objs));
    }

    tx.commit();
}

8、多表查詢

我們將 HQL 多表查詢與 SQL 多表查詢進行對比:

1)SQL 的多表查詢

  • 連接查詢

    • 交叉連接:最不常用的,笛卡爾積

      select * from A,B;

    • 內連接:inner join(inner 可以省略)

      • 隱式內連接

        select * from A,B where A.id = B.aid;

      • 顯式內連接

        select * from A inner join B on A.id = B.aid;

    • 外連接

      • 左外連接:left outer join(outer 可以省略)查到的是左邊表(A)的全部信息,以及兩個表的公共部分

        select * from A left outer join B on A.id = B.aid;

      • 右外連接:right outer join(outer 可以省略)查到的是右邊表(B)的全部信息,以及兩個表的公共部分

        select * from A right outer join B on A.id = B.aid;

  • 子查詢


2)HQL 的多表查詢

  • 連接查詢
    • 交叉連接
    • 內連接
      • 隱式內連接
      • 顯式內連接
      • 迫切內連接
    • 外連接
      • 左外連接
      • 右外連接
      • 迫切左外連接

3)HQL 多表查詢測試

@Test
// HQL的多表查詢
public void demo8() {
    Session session = HibernateUtils.getCurrentSession();
    Transaction tx = session.beginTransaction();

    // SQL: select * from cst_customer c inner join cst_linkman l on c.cust_id = l.lkm_cust_id;
    // HQL:內連接 from Customer c inner join c.linkMans
    //		List<Object[]> list = session.createQuery("from Customer c inner join c.linkMans").list();
    //		for (Object[] objs : list) {
    //			System.out.println(Arrays.toString(objs));
    //		}

    // HQL:迫切內連接 其實就是在普通的內連接 inner join 後添加一個關鍵字 fetch。
    // from Customer c inner join fetch c.linkMans
    // 通過 Hibernate,將另一個對象的數據封裝到該對象中
    List<Customer> list = session.createQuery("select distinct c from Customer c inner join fetch c.linkMans").list();  
    for (Customer customer : list) {
        System.out.println(customer);
    }

    tx.commit();
}


四、QBC 檢索(*重要)

QBC 查詢的全稱是 Query By Criteria,它是一種更加面向對象化的查詢的方式。並不是所有方式都能使用 QBC,有些地方是不支持 QBC 的。

1、簡單查詢

@Test
// 簡單查詢
public void demo9() {
    Session session = HibernateUtils.getCurrentSession();
    Transaction tx = session.beginTransaction();

    // 獲得 Criteria 的對象 
    Criteria criteria = session.createCriteria(Customer.class);
    List<Customer> list = criteria.list();
    for (Customer customer : list) {
        System.out.println(customer);
    }

    tx.commit();
}

2、排序查詢

@Test
// 排序查詢
public void demo10() {
    Session session = HibernateUtils.getCurrentSession();
    Transaction tx = session.beginTransaction();

    // 排序查詢
    Criteria criteria = session.createCriteria(Customer.class);
    //		criteria.addOrder(Order.asc("cust_id"));  // 升序
    criteria.addOrder(Order.desc("cust_id"));  // 降序
    List<Customer> list = criteria.list();
    for (Customer customer : list) {
        System.out.println(customer);
    }

    tx.commit();
}

3、分頁查詢

@Test
// 分頁查詢
public void demo11() {
    Session session = HibernateUtils.getCurrentSession();
    Transaction tx = session.beginTransaction();

    // 分頁查詢
    Criteria criteria = session.createCriteria(LinkMan.class);
    criteria.setFirstResult(10);
    criteria.setMaxResults(10);
    List<LinkMan> list = criteria.list();
    for (LinkMan linkMan : list) {
        System.out.println(linkMan);
    }

    tx.commit();
}

4、條件查詢

@Test
// 條件查詢
public void demo12() {
    Session session = HibernateUtils.getCurrentSession();
    Transaction tx = session.beginTransaction();

    // 條件查詢
    Criteria criteria = session.createCriteria(Customer.class);
    // 設置條件
    /*
	 * =   eq
	 * >   gt
	 * >=  ge
	 * <   lt
	 * <=  le
	 * <>  ne(not equals)
	 * like
	 * in
	 * and
	 * or
	 */
    //		Disjunction disjunction = Restrictions.disjunction();  // 用or連接
    //		disjunction.add(Restrictions.ne("cust_source", "電腦"));
    //		disjunction.add(Restrictions.like("cust_name", "%四"));
    //		criteria.add(disjunction); // 默認用and連接

    criteria.add(Restrictions.ne("cust_source", "電腦"));
    criteria.add(Restrictions.or(Restrictions.like("cust_name", "%四")));   // 這樣也可以用or連接

    //		criteria.add(Restrictions.ne("cust_source", "電腦"));
    //		criteria.add(Restrictions.like("cust_name", "%四"));
    List<Customer> list = criteria.list();
    for (Customer customer : list) {
        System.out.println(customer);
    }

    tx.commit();
}

5、統計查詢

@Test
// 統計查詢
public void demo13() {
    Session session = HibernateUtils.getCurrentSession();
    Transaction tx = session.beginTransaction();

    Criteria criteria = session.createCriteria(Customer.class);
    /*
	 * add             : 普通條件。where 後面條件
	 * addOrder        : 排序
	 * setProjection   : 聚合函數 和 group by having
	 */
    criteria.setProjection(Projections.rowCount());
    Object object = criteria.uniqueResult();
    System.out.println(object);

    tx.commit();
}

6、離線條件查詢(SSH整合中經常使用)---- DetachedCriteria

@Test
// 離線條件查詢
public void demo14() {
    // Web層
    DetachedCriteria detachedCriteria = DetachedCriteria.forClass(Customer.class);
    detachedCriteria.add(Restrictions.like("cust_name", "李%"));

    // Sevice層:直接將 detachedCriteria對象 傳過去
    // Dao層:接收到 detachedCriteria對象
    Session session = HibernateUtils.getCurrentSession();
    Transaction tx = session.beginTransaction();
    // 綁定session
    Criteria criteria = detachedCriteria.getExecutableCriteria(session);
    List<Customer> list = criteria.list();
    for (Customer customer : list) {
        System.out.println(customer);
    }

    tx.commit();
}


五、SQL 檢索

SQL 查詢是通過使用 SQL 語句進行查詢。

@Test
public void demo15() {
    Session session = HibernateUtils.getCurrentSession();
    Transaction tx = session.beginTransaction();

    SQLQuery sqlQuery = session.createSQLQuery("select * from cst_customer");

    //		List<Object[]> list = sqlQuery.list();
    //		for (Object[] objs : list) {
    //			System.out.println(Arrays.toString(objs));
    //		}

    sqlQuery.addEntity(Customer.class);
    List<Customer> list = sqlQuery.list();
    for (Customer customer : list) {
        System.out.println(customer);
    }

    tx.commit();
}


博客中若有不恰當的地方,請您一定要告訴我。前路崎嶇,望我們可以互相幫助,並肩前行!



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