Hibernate查詢方式
-
對象導航查詢
----根據id查詢某個客戶,再查詢這個客戶裏面所有的聯繫人 -
OID查詢
----根據id查詢某一條記錄,返回對象 -
HQL查詢
----Query對象,寫hql語句實現查詢 -
QBC查詢
----Criteria對象 -
本地sql查詢
----SQLQuery對象,使用普通sql實現查詢
1.對象導航查詢
例:查詢某個客戶裏面所有聯繫人(一對多)過程,使用對象導航實現
//根據cid=1客戶,再查詢客戶中所有聯繫人
Customer customer = session.get(Customer.class,1);
//查詢這個客戶的所有聯繫人
//直接得到客戶裏聯繫人的set集合
Set<LinkMan> linkman = customer.getLinkMan();
2.OID查詢
根據id查詢記錄----調用session裏面的get方法實現
//根據cid=1客戶,再查詢客戶中所有聯繫人
Customer customer = session.get(Customer.class,1);
3.HQL查詢
- hql:hibernate query language,hibernate提供一種查詢語言,hql語言和普通sql很相似,區別:普通sql操作數據庫表和字段,hql操作實體類和屬性
- 常用的hql語句
(1)查詢所有: from 實體類名稱
(2)條件查詢: from 實體類名稱 where 屬性名稱=?
(3)排序查詢: from 實體類名稱 order by 實體類屬性名稱 asc/desc - 使用hql查詢操作時候,使用Query對象
(1)創建Query對象,寫hql語句
(2)調用query對象裏面的方法得到結果
3.1HQL查詢所有
例:查詢所有客戶記錄
(1)創建Query對象,寫hql語句
(2)調用query對象裏面的方法得到結果
//1 創建query對象
Query query = session.createQuery("from Customer");
//2 調用方法得到結果
List<Customer> list = query.list();
for (Customer customer : list) {
System.out.println(customer.getCid()+"::"+customer.getCustName());
}
3.2HQL常用查詢
hql條件查詢語句寫法:
(1)from 實體類名稱 where 實體類屬性名稱=? and實體類屬性名稱=?
(2)from 實體類名稱 where 實體類屬性名稱 like ?
//-----條件查詢--------
//1 創建query對象
//SELECT * FROM t_customer WHERE cid=? AND custName=?
Query query = session.createQuery("from Customer c where c.cid=? and c.custName=?");
//2 設置條件值
// 向?裏面設置值
// setParameter方法兩個參數
// 第一個參數:int類型是?位置,?位置從0開始
// 第二個參數:具體參數值
//設置第一個?值
query.setParameter(0, 1);
//設置第二個?值
query.setParameter(1, "百度");
//3 調用方法得到結果
List<Customer> list = query.list();
for (Customer customer : list) {
System.out.println(customer.getCid()+"::"+customer.getCustName());
}
//-------模糊查詢------
//1 創建query對象
Query query = session.createQuery("from Customer c where c.custName like ?");
//2 設置?的值
// %浪%
query.setParameter(0, "%浪%");
//3 調用方法得到結果
List<Customer> list = query.list();
for (Customer customer : list) {
System.out.println(customer.getCid()+"::"+customer.getCustName());
}
//-----排序查詢--------
//1 創建query對象
Query query = session.createQuery("from Customer order by cid desc");
//2 調用方法得到結果
List<Customer> list = query.list();
for (Customer customer : list) {
System.out.println(customer.getCid()+"::"+customer.getCustName());
}
//------分頁查詢------
//1 創建query對象
//寫查詢所有的語句
Query query = session.createQuery("from Customer");
//2 設置分頁數據
//2.1 設置開始位置
query.setFirstResult(0);
//2.2 設置每頁記錄數
query.setMaxResults(3);
//3 調用方法得到結果
List<Customer> list = query.list();
for (Customer customer : list) {
System.out.println(customer.getCid()+"::"+customer.getCustName());
}
//投影查詢
//1.投影查詢:查詢不是所有字段值,而是部分字段的值
//2 投影查詢hql語句寫法:
//(1)select 實體類屬性名稱1, 實體類屬性名稱2 from 實體類名稱
//(2)select 後面不能寫 * ,不支持的
//1 創建query對象
Query query = session.createQuery("select custName from Customer");
//2 調用方法得到結果
List<Object> list = query.list();
for (Object object : list) {
System.out.println(object);
}
//----聚集函數使用----
//常用函數count、sum、avg、max、min
//1 創建query對象
Query query = session.createQuery("select count(*) from Customer");
//2 調用方法得到結果
//query對象裏面有方法,直接返回對象形式
Object obj = query.uniqueResult();
//返回int類型
// int count = (int) obj;
//首先把object變成long類型,再變成int類型
Long lobj = (Long) obj;
int count = lobj.intValue();
System.out.println(count);
4.QBC查詢
- 使用hql查詢需要寫hql語句實現,但是使用qbc時候,不需要寫語句了,使用方法實現
- 使用qbc時候,操作實體類和屬性
- 使用qbc,使用Criteria對象實現
4.1QBC查詢所有
(1)創建Criteria對象
(2)調用方法得到結果
//1 創建對象
Criteria criteria = session.createCriteria(Customer.class);
//2 調用方法得到結果
List<Customer> list = criteria.list();
4.2QBC常用查詢
//-----條件查詢------
//1 創建對象
Criteria criteria = session.createCriteria(Customer.class);
//2 使用Criteria對象裏面的方法設置條件值
// 首先使用add方法,表示設置條件值
// 在add方法裏面使用類的方法實現條件設置
// 類似於 cid=?
// criteria.add(Restrictions.eq("cid", 1));
// criteria.add(Restrictions.eq("custName", "百度"));
criteria.add(Restrictions.like("custName", "%百%"));
//3 調用方法得到結果
List<Customer> list = criteria.list();
//-----排序查詢-----
//1 創建對象
Criteria criteria = session.createCriteria(Customer.class);
//2 設置對哪個屬性進行排序,設置排序規則
criteria.addOrder(Order.desc("cid"));
//3 調用方法得到結果
List<Customer> list = criteria.list();
//-----分頁查詢-----
//1 創建對象
Criteria criteria = session.createCriteria(Customer.class);
//2 設置分頁數據
//2.1 設置開始位置
criteria.setFirstResult(0);
//2.2 每頁顯示記錄數
criteria.setMaxResults(3);
//3 調用方法得到結果
List<Customer> list = criteria.list();
//-----統計查詢------
//1 創建對象
Criteria criteria = session.createCriteria(Customer.class);
//2 設置操作
criteria.setProjection(Projections.rowCount());
//3 調用方法得到結果
Object obj = criteria.uniqueResult();
Long lobj = (Long) obj;
int count = lobj.intValue();
//-----離線查詢------
//1 servlet調用service,service調用dao
//(1)在dao裏面對數據庫crud操作
//(2)在dao裏面使用hibernate框架,使用hibernate框架時候,調用session裏面的方法實現功能
//1 創建對象
//Criteria criteria = session.createCriteria(Customer.class);
DetachedCriteria detachedCriteria = DetachedCriteria.forClass(Customer.class);
//2 最終執行時候才需要到session
Criteria criteria = detachedCriteria.getExecutableCriteria(session);
List<Customer> list = criteria.list();