天天看點

Hibernate 的多種查詢方式 —— HQL 與 QBC

一、OID 查詢

OID 查詢是指根據對象 OID 主鍵進行檢索

OID 查詢方式:

  • get(): 立即發出 SQL 語句,傳回實際對象,查詢不到時傳回 null
  • load(): 傳回一個目标對象的代理對象,隻存儲了目标對象的 ID 值,當調用其他屬性時才發出 SQL 語句,查詢不到報錯

二、對象導航檢索

對象導航檢索是指根據一個已查詢到的對象,獲得其關聯對象

三、HQL(Hibernate Query Language)

hibernate 的查詢語言,類似于 SQL, 但面向對象。采用 session.creatQuery(),注意不支援 * 的寫法

1. 簡單查詢

```
Query query = session.createQuery("from User");
List<User> list = query.list();
```
           

2. 别名查詢

```
Query query = session.createQuery("select c from User c");
List<User> list = query.list();
```
           

3. 排序查詢

```
Query query = session.createQuery("select c from User c order by user_id desc");
List<User> list = query.list();
```
           

4. 條件查詢

  • 位置綁定,類似于 JDBC 現在不用了
  • 名稱綁定
    Query query = session.createQuery("from User where user_code=:aaa and user_name=:bbb");
    query.setParameter("aaa","11");
    query.setParameter("bbb","user1");
    List<User> list = query.list();
               

5. 投影查詢

  • 單個屬性
    List<Object> list = session.createQuery("select c.user_name from User c").list();
    System.out.println(list);
               
  • 多個屬性
    List<Object[]> list = session.createQuery("select c.user_name,c.user_code from User c").list();
    for (Object[] objects : list) {
        System.out.println(Arrays.toString(objects));
    }
               
  • 多個屬性,封裝到對象,需要提供構造器
    List list = session.createQuery("select new User(user_code,user_name) from User").list();
    System.out.println(list);
               

6. 分頁查詢

```
Query query = session.createQuery("from User");
// 位置從 0 開始數,包含 0
query.setFirstResult(0);
query.setMaxResults(2);
List list = query.list();
System.out.println(list);
```
           

7. 統計查詢

  • 統計
    Object o = session.createQuery("select count(*) from User").uniqueResult();
    System.out.println(o);
               
  • 分組
    List<Object[]> list = session.createQuery("select user_code,count(*) from User group by user_code").list();
    for (Object[] objects : list) {
        System.out.println(Arrays.toString(objects));
    }
               

8. 多表查詢

  • 内連接配接:外鍵相等的部分取出來
  • 左連接配接:左邊表全部,右邊隻查外鍵相等部分
  • 右連接配接:右邊表全部,左邊表隻查外鍵相等部分
  • 普通内連接配接
    List<Object[]> list = session.createQuery("from User c inner join c.roles").list();
    for (Object[] objects : list) {
        System.out.println(Arrays.toString(objects));
    }
               
  • 迫切内連接配接
    List<User> list = session.createQuery("from User c inner join fetch c.roles").list();
    for (User user : list) {
        System.out.println(user);
    }
               

四、QBC(Query By Criteria)

QBC 主要用于條件查詢,更加面向對象

1. 簡單查詢

```
List<User> list = session.createCriteria(User.class).list();
for (User user : list) {
    System.out.println(user);
}
```
           

2. 排序查詢

```
// 添加排序
criteria.addOrder(Order.asc("user_id"));
```
           

3. 分頁查詢

```
// 添加分頁
criteria.setFirstResult(0);
criteria.setMaxResults(2);
```
           

4. 條件查詢

  • 條件

    = eq

    > gt

    >= ge

    < lt

    <= le

    <> ne

    like

    in

    and

    or

  • 單個條件
    criteria.add(Restrictions.eq("user_name","user1"));
               
  • 多個條件
    criteria.add(Restrictions.eq("user_name","user1"));
    criteria.like(Restrictions.eq("user_code","1%"));
               
  • 統計查詢
    Criteria criteria = session.createCriteria(User.class);
    // setProjection 設定一些聚合函數
    Object o = criteria.setProjection(Projections.rowCount()).uniqueResult();
    System.out.println(o);
               
  • 離線條件查詢,脫離Session,添加條件,可以在外部提前使用 DetachedCriteria 對象送出設定好條件,最後再綁定到 session 當中
    DetachedCriteria detachedCriteria = DetachedCriteria.forClass(User.class);
    // 設定條件
    detachedCriteria.add(Restrictions.eq("user_name","user1"));
    // 打開 session
    Session session = HibernateUtil.openSession();
    Criteria executableCriteria = detachedCriteria.getExecutableCriteria(session);
    List list = executableCriteria.list();
    System.out.println(list);