一、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);