hibernate教程--检索方式详解(hql,sql,QBC)
1.1?Hibernate的檢索方式
1.1.1?Hibernate的檢索方式:
檢索方式:查詢的方式:
導(dǎo)航對(duì)象圖檢索方式: ?根據(jù)已經(jīng)加載的對(duì)象導(dǎo)航到其他對(duì)象
* Customer customer = (Customer)session.get(Customer.class,1);
* customer.getOrders();// 獲得到客戶的訂單
OID 檢索方式: ?按照對(duì)象的 OID 來檢索對(duì)象
* get()/load();方法進(jìn)行檢索.
HQL 檢索方式: 使用面向?qū)ο蟮?HQL 查詢語言
* Query query = session.createQuery(“HQL”);
QBC 檢索方式: 使用 QBC(Query By Criteria) API 來檢索對(duì)象. 這種 API 封裝了基于字符串形式的查詢語句, 提供了更加面向?qū)ο蟮牟樵兘涌?
* Criteria criteria = session.createCriteria(Customer.class);
本地 SQL 檢索方式: 使用本地?cái)?shù)據(jù)庫的 SQL 查詢語句
* SQLQuery query = session.createSQLQuery(“SQL”);
1.1.2?HQL:
HQL:Hibernate Query Language:
* 特點(diǎn):
* 面向?qū)ο蟮牟樵?
* 支持方法鏈編程:
* 使用:
1.查詢所有記錄:
List<Customer> list = session.createQuery("from Customer").list();for (Customer customer : list) {System.out.println(customer);}2.查詢使用別名:
// 使用別名// 別名as可以省略/* List<Customer> list =session.createQuery("from Customer c").list();System.out.println(list);*/// 使用別名:帶參數(shù)/*List<Customer> list = session.createQuery("from Customer as c where c.cname = ?").setString(0, "小沈").list();System.out.println(list);*/// 不支持 select * from Customer寫法.可以寫成 select 別名 from Customer as 別名;List<Customer> list = session.createQuery("select c from Customer c").list();System.out.println(list);3.排序:
List<Customer> list = session.createQuery("from Customer c order by c.id desc").list();for (Customer customer : list) {System.out.println(customer);}4.分頁查詢:
Query query = session.createQuery("from Order");query.setFirstResult(20);query.setMaxResults(10);List<Order> list = query.list();for (Order order : list) {System.out.println(order);}5.單個(gè)對(duì)象查詢:
Customer customer = (Customer) session.createQuery("from Customer where cname = ?").setString(0, "小明").uniqueResult();System.out.println(customer);6.參數(shù)綁定:
// 1.使用?號(hào)方式綁定/*Query query = session.createQuery("from Customer where cname = ?");query.setString(0, "小沈");List<Customer> list = query.list();System.out.println(list);*//*Query query = session.createQuery("from Customer where cname = ? and cid =?");query.setString(0, "小沈");query.setInteger(1,3);List<Customer> list = query.list();System.out.println(list);*/// 2.使用名稱的方式綁定Query query = session.createQuery("from Customer where cname=:name and cid=:id");query.setString("name", "小沈");query.setInteger("id", 3);List<Customer> list = query.list();System.out.println(list);// 3.綁定實(shí)體List<Order> list = session.createQuery("from Order o where o.customer = ?").setEntity(0, customer).list();for (Order order : list) {System.out.println(order);}7.投影操作:
// 查詢客戶的名稱:/** List<Object> list = session.createQuery(* "select c.cname from Customer c").list(); System.out.println(list);*//** List<Object[]> list = session.createQuery(* "select c.cid,c.cname from Customer c").list(); for (Object[] objects* : list) { System.out.println(Arrays.toString(objects)); }*/List<Customer> list = session.createQuery("select new Customer(cname) from Customer").list();System.out.println(list);8.模糊查詢:
Query query = session.createQuery("from Customer where cname like ?");query.setParameter(0, "小%");List<Customer> list = query.list();System.out.println(list);SQL多表查詢:
* 連接:
* 交叉連接:
* select * from A,B;
* 內(nèi)連接:查詢的是兩個(gè)表的交集!
* select * from A inner join B on A.字段 = B.字段;
* 隱式內(nèi)連接:
* select * from A,B where A.字段 = B.字段;
* 外連接:
* 左外連接:
* select * from A left outer join B on ?A.字段 = B.字段;
* 右外連接:
* select * from A right outer join B on A.字段 = B.字段;
HQL多表的查詢:
* 連接:
* 交叉連接:
* 內(nèi)連接:
* 隱式內(nèi)連接:
* 迫切內(nèi)連接:
* 左外連接:
* 迫切左外連接:
* 右外連接:
* HQL的內(nèi)連接和迫切內(nèi)連接區(qū)別:
* 內(nèi)連接查詢 :將數(shù)據(jù)封裝一個(gè)List<Object[]>中.
* 迫切內(nèi)連接 :將數(shù)據(jù)封裝一個(gè)List<Customer>中.但是迫切內(nèi)連接,得到會(huì)有重復(fù)記錄 ,需要使用distinct排重.
1.1.3?QBC:
1.查詢所有記錄:
List<Customer> list = session.createCriteria(Customer.class).list();for (Customer customer : list) {System.out.println(customer);}2.排序:
List<Customer> list = session.createCriteria(Customer.class).addOrder(org.hibernate.criterion.Order.desc("id")).list();for (Customer customer : list) {System.out.println(customer);}3.分頁:
Criteria criteria = session.createCriteria(Order.class);criteria.setFirstResult(10);criteria.setMaxResults(10);List<Order> list = criteria.list();for (Order order : list) {System.out.println(order);}4.獲取單個(gè)對(duì)象:
Customer customer = (Customer) session.createCriteria(Customer.class).add(Restrictions.eq("cname", "小明")).uniqueResult();System.out.println(customer);5.帶參數(shù)的查詢:
/** List<Customer> list = session.createCriteria(Customer.class)* .add(Restrictions.eq("cname", "小明")).list();* System.out.println(list);*/List<Customer> list = session.createCriteria(Customer.class).add(Restrictions.eq("cname", "小明")).add(Restrictions.eq("cid", 2)).list();System.out.println(list);6.模糊查詢:
Criteria criteria = session.createCriteria(Customer.class);criteria.add(Restrictions.like("cname", "大%"));List<Customer> list = criteria.list();System.out.println(list);1.1.4?SQL:
1.SQL語句查詢所有記錄:
List<Object[]> list = session.createSQLQuery("select * from customer").list();for (Object[] objects : list) {System.out.println(Arrays.toString(objects));}List<Customer> list = session.createSQLQuery("select * from customer").addEntity(Customer.class).list();for (Customer customer : list) {System.out.println(customer);}總結(jié)
以上是生活随笔為你收集整理的hibernate教程--检索方式详解(hql,sql,QBC)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: hibernate教程--检索方式(hq
- 下一篇: hibernate教程--抓取策略