根據已經加載的對象導航到其他對象
例如:在前面的各種映射關係中,實體類包含對其他類對象的引用。
Dept d = (Dept) session.get(Dept.class,2);
d.getStaffSet().size(); //d對象關聯Staff集合,hibernate會自動檢索Staff數據。如何檢索的,看下面圖中發送的sql語句。
1.2、OID檢索方式
按照對象的OID來檢索對象
依賴Session接口主要是:load()/get()的用法
1.3、HQL檢索方式
HQL:Hibernate Query Language ,是面向對象的查詢語言,它和SQL查詢語言有些相似,在Hibernate提供的各種檢索方式中,HQL是使用的最廣的一種檢索方式,
注意:HQL操作的全是POJO類中的屬性,而不是操作數據庫表中的字段。
1.4、QBC檢索方式
QBC:Query By Criteria,是一種更加面向對象的查詢語言,提供的一系列QBC API來檢索對象。
HQL所能做的事情,使用QBC也大多能做用,這個通過實例來看看QBC是如何使用的。
步驟:
1>獲得session
2>session.createCriteria(Obejct.class); 創建criteria對象
3>使用criteria的API方法進行條件的增加。add(Restrictions.eq(屬性名,值))
4>執行查詢
list():返回一個集合列表,有可能集合中裝的是數組,有可能是POJO對象。
uniqueResult():返回一個查詢結果,在已知查詢結果只有一個或者0個時,使用是沒有問題的,如果返回結果有多個,那麼就會報異常
例子一:使用QBC來對Staff進行查詢
//使用QBC,更加面向對象,不用寫sql語句。要查詢什麼,就直接將其類.class當作參數就能查詢出來
Criteria QBCCriteria = session.createCriteria(Staff.class);
List<Staff> staffList = QBCCriteria.list();
for(Staff staff : staffList){
System.out.println(staff.toString());
}
//結果
Hibernate:
select
this_.id as id1_0_,
this_.name as name1_0_,
this_.deptId as deptId1_0_
from
staff this_
Staff [id=2, name=qqq1]
Staff [id=3, name=qqq2]
Staff [id=4, name=qqq3]
Staff [id=5, name=qqq4]
Staff [id=6, name=qqq5]
Staff [id=7, name=qqq6]
Staff [id=8, name=qqq7]
Staff [id=9, name=qqq8]
Staff [id=10, name=qqq9]
例子二:使用QBC來對Staff進行條件查詢
//使用QBC,對Staff進行查詢
Criteria QBCCriteria = session.createCriteria(Staff.class);
//add()添加條件,通過Restrictions(字段名,值),由於確定是1行記錄,所以直接用uniqueResult()
Staff staff = (Staff) QBCCriteria.add(Restrictions.eq("id",3)).uniqueResult();
System.out.println(staff.toString());
//結果
Hibernate:
select
this_.id as id1_0_,
this_.name as name1_0_,
this_.deptId as deptId1_0_
from
staff this_
where
this_.id=?
Staff [id=3, name=qqq2]
例子三:QBC也能進行連接查詢
// from Staff inner join dept d ON 後面是hibernate自動幫我們填寫;
Criteria criteria = session.createCriteria(Staff.class);
//createAlias默認是內連接,可以不用寫。可以爲dept表取別名,也可以不取。
criteria.createAlias("dept", "d", Criteria.INNER_JOIN);
List list = criteria.list();
System.out.println(list);
//結果
Hibernate:
select
this_.id as id1_1_,
this_.name as name1_1_,
this_.deptId as deptId1_1_,
d1_.id as id0_0_,
d1_.name as name0_0_
from
staff this_
inner join
dept d1_
on this_.deptId=d1_.id
[oneToMany.Staff@6a155d66, oneToMany.Staff@55a7e5ae, oneToMany.Staff@1d82e71, oneToMany.Staff@17d0fda9, oneToMany.Staff@19bd6e76, oneToMany.Staff@639f122d, oneToMany.Staff@60627b73, oneToMany.Staff@6196ec74, oneToMany.Staff@7b7de5b9]
給一張表來看看qbc增加的條件查詢語句。
重點有一個離線Criteria對象的用法。
1、在web層封裝查詢條件到離線Criteria對象中,將其DetachedCriteria對象綁定到Thread上。
2、到dao層,就能通過Thread拿到該離線Criteria對象,然後創建session。將session給DetachedCriteria,就能夠執行查詢
代碼:
WEB層
DetachedCriteria detachedCriteria =DetachedCriteria.forClass(Customer.class);
detachedCriteria.add(Restrictions.eq("name", "kitty"));
DAO層
Session session = HibernateUtils.openSession();
Transaction transaction = session.beginTransaction();
// 將離線查詢對象 關聯到Session
Criteria criteria = detachedCriteria.getExecutableCriteria(session);
Customer customer = (Customer) criteria.uniqueResult();
1.5、本地SQL檢索方式
使用標準的SQL語句來編寫。
步驟:
1>獲得session
2>編寫sql語句
3>session.createSQLQuery(sql);獲取SQLQuey對象
4>給sql語句設置參數。
5>執行查詢
list():返回一個集合列表,集合中裝的是Object[]。
返回實體類對象集合,如果與實體類進行了綁定,也就是使用了addEntity(xxx.class)。
二、總結
以上就是我們說的5種檢索,其中說的重點就是hql的用法,上面的例子全部寫完了差不多就對hql有一定的瞭解。記住hql是對pojo類進行操作,而不是對數據庫中的表。在使用連接查詢時,可以使用QBC,因爲更簡單,只需要用createAlias()就能使用任何的連接。一般在開發中sql語句都會提取出來放到hbm中,例如
在hbm映射文件 (也可以用註解配置)
<!-- 這裏可以定義命名查詢 -->
<!-- 定義 HQL 語句 <query name=""></query> -->
<!-- 定義 SQL 語句 <sql-query name=""></sql-query> -->
<query name="findCustomerByName">
<![CDATA[from Customer where name = ?]]>
</query>
* 爲hql語句 起了一個名字
程序代碼:
//相當於把sql語句分離開來了。方便維護
Query query = session.getNamedQuery("findCustomerByName");
query.setParameter(0, "tom");
Customer customer = (Customer) query.uniqueResult();