版權聲明:本文爲 小異常 原創文章,非商用自由轉載-保持署名-註明出處,謝謝!
本文網址: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();
}