查詢單個對象可以直接通過Session對象來做到,其中session這個對象提過了2種獲得單個對象的方法,一個是get方法和load方法,我去看這個兩個方法的時候發現這兩個方法的參數是一樣的,使用方式也是一樣的,我們先來看看具體的使用方法:
- Object?obj?=?session.get(user.getClass(),?100);
- Object?obj1?=?session.load(user.getClass(),?200);
這個方法的使用方式看起來都一樣都能獲取到一個object對象,其實這兩個方法有很大的區別:
1.用get方法的時候是session會立即創建一個連接並獲取數據,用load方法的時候是session不會去創建連接然後去獲取數據,它會在你去獲取你要查詢的對象的屬性的時候纔會去創建連接和獲取數據,所以說,用load的話,我們獲取到的obj1裏面其實沒有任何數據,只有我們obj1.getXXX();的時候纔會去獲取數據庫的數據,但是如果我們在沒有去獲取它的屬性以前,就關閉了session的話,就會報session已經關閉了。
2.用load方法的時候如果查詢出來的對象裏面又包含一個對象屬性呢,當我們查詢出來的時候這個對象裏面的對象屬性是爲null的,當具體要getXXX對象屬性的時候纔會去訪問。
3.用get的話如果傳入的id不存在會返回空值,load返回一個代理類,如果id不存在,報id不存在異常
上面的兩種方法都要通過主鍵進行查詢,其他字段不能夠使用。而我們在平常項目中很多時候需要通過一個唯一約束條件得到一個對象。比如通過用戶名得到密碼,這個時候可以使用uniqueResult()方法來獲取。比如
Query q = session.createQuery("select t.password from TUserLogin t where t.username='"+loginUser+"'");
Object o = q.uniqueResult();
這個時候o就是一個字符串類型的對象。