Hibernate的檢索方式
一、導航對象檢索:
- 概述:根據已經加載的對象導航到其他的對象。例如可以根據訂單的信息找到客戶的相關信息
Order order = session.get(Order.Class,1l);
Customer customer = order.getCustomer();
二、OID檢索:
- 概述:利用session的get()、load()方法檢索某條記錄對應的對象
- get()與load方法的區別:
* get方法
* * 採用的是立即加載,執行到這行代碼的時候,就會馬上發送SQL語句去查詢。
* * 查詢後返回是真實對象本身。
* * 查詢一個找不到的對象的時候,返回null
*
* load方法
* * 採用的是延遲加載,執行到這行代碼的時候,不會發送SQL語句,當真正使用這個對象的時候纔會發送SQL語句。
* * 查詢後返回的是代理對象。javassist-3.18.1-GA.jar 利用javassist技術產生的代理。
* * 查詢一個找不到的對象的時候,返回ObjectNotFoundException
Order order = session.get(Order.Class,1l);
Order order = session.load(Order.Class,1l);
三、HQL檢索:
概述:面向對象的查詢語言,和SQL語言有些類似,但它使用的是類、對象和屬性,沒有表和字段的概念
1.HQL簡單查詢:
1.1查詢所有的Customer
Query query = session.createQuery("from com.jjxy.hibernate.Customer");
List<Customer> list = query.list();
1.2HQL 別名查詢
Query query = session.createQuery("from com.jjxy.hibernate.Customer c");
或者
Query query = session.createQuery("select c from com.jjxy.hibernate.Customer c");
List<Customer> list = query.list();
2.HQL排序查詢:降序(desc)、默認.....升序(asc),利用關鍵字 order by
Query query = session.createQuery("from Customer order by cust_id desc");
List<Customer> list = query.list();
3.HQL條件查詢:位置綁定、名稱綁定查詢兩種
3.1位置綁定
3.1.1單個條件查詢
ry = session.createQuery("from Customer where cust_name=?");
query.setParameter(0,"小李")
List<Customer> list = query.list();
3.1.2多個條件查詢 (綁定多個參數,用Query對象的setParameter()方法設置查詢值)
Query query = session.createQuery("from Customer where cust_name=? and cust_source like ?");
query.setParameter(0,"小李");
query.setParameter(1,"微信");
List<Customer> list = query.list();
3.2名稱綁定查詢
Query query = session.createQuery("from Customer where cust_name= :cust_name and cust_source like:cust_source");
query.setParameter("cust_name","小李");
query.setParameter("cust_source","微信");
List<Customer> list = query.list();
4. HQL的投影查詢:查詢某個對象的某個或某些屬性
4.1查詢某個屬性 :將它們可以保存在List的Object集合中
List<Object> list = session.createQuery("select c.cust_name from Customer c").list();
4.2查詢多個屬性:多個屬性要保存,可以選擇保存在List的Object數組集合中
List<Object[]> list = session.createQuery("select c.cust_name,c.cust_source from Customer c").list();
for(Object[] object :list){
System.out.println(Arrays.toString(object));
}
4.2.1查詢多個屬性封裝到原有的對象中去:查詢哪些屬性就要在實體類中設置其屬性的有參、無參構造方法。
List<Customer> list1 = session.createQuery("select new Customer(cust_name,cust_source) from Customer").list();
for(Customer customer:list1){
System.out.println(customer);
}
5.HQL的分頁查詢 : setFirstResult()、 setMaxResults()
Query query = session.createQuery("from LinkMan");
query.setFirstResult(0);
query.setMaxResults(10);
List<LinkMan> list = query.list();
6.HQL的分頁統計查詢
6.1統計查詢 : 聚合函數的使用 ........count,max,min,avg,sum
Long l = (Long)session.createQuery("select count(*) from Customer").uniqueResult();
System.out.println(l);
6.2 分組查詢 :group by (having count(*)>=1)....設置記錄數限制
List<Object[]> objects= session.createQuery("select cust_source,count (*) from Customer group by cust_source having count(*) >=1").list();
for (Object[] objects1:objects){
System.out.println(Arrays.toString(objects1));
}
四、QBC檢索
概述:(Query By Criteria),主要由Criteria接口實現
1.QBC簡單查詢
Criteria criteria = session.createCriteria(Customer.class);
List<Customer> list = criteria.list();
2.排序查詢:addOrader()
Criteria criteria = session.createCriteria(Customer.class);
List<Customer> list = criteria.addOrder(Order.desc("cust_id")).list();
3.分頁查詢
Criteria criteria = session.createCriteria(LinkMan.class);
criteria.setFirstResult(10);
criteria.setMaxResults(10);
List<LinkMan> list = criteria.list();
4.條件查詢 :add()
Criteria criteria = session.createCriteria(Customer.class);
//設置條件
/*
* = eq
* > gt
* >= ge
* < lt
* <= le
* <> ne
* like
* in
* and
* or
* */
criteria.add(Restrictions.eq("cust_source","微信"));
/*設置第二個並列的條件*/
criteria.add(Restrictions.like("cust_name","%李"));
List<Customer> list = criteria.list();
5.統計查詢
Criteria criteria = session.createCriteria(Customer.class);
/*
* add :普通的條件查詢
* addOrder :排序
* setProjection :聚合函數
* */
Long aLong = (Long) criteria.setProjection(Projections.rowCount()).uniqueResult();
System.out.println(aLong);
6.離線查詢 :DetachedCriteria對象
DetachedCriteria detachedCriteria = DetachedCriteria.forClass(Customer.class);
/*模擬業務層傳來的數據*/
detachedCriteria.add(Restrictions.like("cust_name","%李"));
Session session = HibernateUtils.getCurrentSession();
Transaction tx = session.beginTransaction();
Criteria c = detachedCriteria.getExecutableCriteria(session);
List<Customer> list = c.list();
for(Customer customer:list){
System.out.println(customer);
}
tx.commit();
五、SQL檢索:
1.將查詢的SQLQuery封裝至對象中: ........addEntity()方法
public void demo(){
Session session = HibernateUtils.getCurrentSession();
Transaction tx = session.beginTransaction();
SQLQuery sqlQuery = session.createSQLQuery("select *from cst_customer");
/* List<Object[]> list = sqlQuery.list();
for(Object[] objects:list){
System.out.println(Arrays.toString(objects));
}*/
/*將SQLQuery封裝至對象中*/
sqlQuery.addEntity(Customer.class);
List<Customer> list = sqlQuery.list();
for(Customer customer:list){
System.out.println(customer);
}
tx.commit();
}