Hibernate三種狀態;query查詢;ResultTransformer轉換為pojo對象;能夠將query語句寫在xml中;Criteria查詢;ProjectionList總和/f分組等函數
https://blog.csdn.net/u010026901/article/details/24256091
Session操作過程中的pojo對象存在三種狀態:
1)??瞬時態:該對象在數據庫中沒有相應的數據
2)??持久態:數據庫中存在該對象相應的數據。同一時候操作該對象的Session也存在。
3)??遊離態:數據庫中包括該對象相應的數據。但操作此對象的Session已經不存在或被關閉了。
?
三種狀態之間的轉換:
瞬時 à 持久:save(),saveOrUpdate()
持久 à 瞬時:delete()
持久 à 遊離:close()
遊離 à 持久:update(),saveOrUpdate()
?
?
針對持久態對象。Hibernate還存在下面兩個特點:
1)??持久態對象,在同一Session中僅僅存在同一個。
a)?????????假設連接不關閉,多次查詢同一條數據。僅僅返回同一個對象,也就是僅僅查詢一次數據庫。
b)????????此功能也被稱為一級緩存,但實際開發中有用性非常低。
2)??改動持久態對象的屬性,能夠自己主動同步到數據庫相應的數據中。
a)?????????當改動了一個持久態對象的屬性,興許又有操作並且提交了事務,則數據庫自己主動調用更新操作,也一起改動。
b)????????當登陸後。要求將當前系統時間,作為最後登陸時間保存到數據庫中時,能夠使用。
Session中get和load方法的差別?
1)??假設沒有查詢到數據,get會返回null。而load則直接提示錯誤。
2)??使用load查詢時。可能會出現下面錯誤,由於load方式使用的是懶漢式載入方法。
運行load方法時,不立馬查詢數據庫。
當用到查詢出的對象的屬性時。才載入數據。遊離態會報錯
public
?????? // 註意,使用Hibernate刪除時,必須先查詢對象,再刪除.
?????? //HibernateSessionFactory.getSession().delete(findById(id));
?????? String hql = "DELETE FROMNews AS n WHERE n.id = ?" ;
?????? Query query = HibernateSessionFactory.getSession().createQuery(hql);
?????? query.setInteger(0, id);
?????? query.executeUpdate();
??? }
1)??當刪除一條數據時,直接使用Session.delete(),由於簡單。
2)??批量刪除時,使用HQL形式。
? ??public void doUpdate(News vo) throws Exception {
?????? //HibernateSessionFactory.getSession().update(vo);
?????? String hql = "UPDATE NewsAS n SET n.title = ?,n.content = ? WHERE n.id = ?" ;
?????? Query query = HibernateSessionFactory.getSession().createQuery(hql);
?????? query.setString(0, vo.getTitle());
?????? // ....其它參數一樣設置
?????? query.executeUpdate();
??? }1)??假設是直接的改動功能,肯定選擇Session.update方法
2)??假設是僅僅改某一個字段。使用HQL方式,比如:改動password
針對HQL的查詢功能,也支持寫SELECT。能夠通過編寫SELECT,來僅僅查詢對象中某一個或某幾個屬性。
public List testHQL()throws Exception {
?????? String hql = "SELECTn.id,n.title FROM News AS n";
?????? Query query = HibernateSessionFactory.getSession().createQuery(hql);
?????? return query.list();
??? }但查詢兩個以上的字段時,返回的是List<Object[]>,每一條查詢出的數據。使用Object[]來表示。
public void testHQL() throws Exception {
?????? List all = ServiceFactory.getINewsServiceInstance().testHQL();
?????? Object[]value1 = (Object[])all.get(0);
?????? System.out.println(value1[1]);
??? }這樣使用起來非常麻煩,因此在Hibernate3.2以上的版本號中。提供了一個自己主動轉換類,能夠將查詢出的Object[],自己主動轉換為pojo 對象。
public List testHQL()throws Exception {
?????? String hql = "SELECT n.idAS id,n.titleAS title FROM News ASn";
?????? Query query = HibernateSessionFactory.getSession().createQuery(hql);
??? ??? query
????????????? .setResultTransformer(newAliasToBeanResultTransformer(
???????????????????? News.class));
?
?????? return query.list();
??? }Query有一個子接口是SQLQuery,該類支持SQL語句的處理,但實際開發中一般不用。
String sql = "SELECT id AS id,title AS title,content AScontent,pub_date AS pubDate FROM news";
?????? SQLQuery query = HibernateSessionFactory.getSession().createSQLQuery(
????????????? sql);
?????? query
????????????? .setResultTransformer(new AliasToBeanResultTransformer(
???????????????????? News.class));
?????? return query.list();但。註意。在Oracle數據庫中,為了提高性能,Oracle自己主動將所有字段名轉換為大寫。因此假設想要使用,必須將pojo對象的屬性也寫為大寫才幹設置。
Hibernate還能夠將語句寫到配置文件裏。
? ??<queryname="findAll">
?????? FROM News AS n WHERE n.title LIKE ?
??? </query>
通過程序讀取配置文件,取得這段HQL,並生成Query對象。完畢查詢。
Query query =HibernateSessionFactory.getSession().getNamedQuery(
????????????? "findAll");
?????? query.setString(0, "%測試%");
?????? return query.list();Criteria也是Hibernate提供的一個查詢對象,支持按對象的方式來完畢查詢
public List<News> testCriteria()throws Exception {
?????? // 依據傳入的pojo類型,查詢該類型相應的所有數據
?????? Criteria c = HibernateSessionFactory.getSession().createCriteria(
????????????? News.class);
?????? // 1、WHERE id =26
?????? //c.add(Restrictions.eq("id", 26));
?????? // 2、WHERE id> 26
?????? //c.add(Restrictions.gt("id", 26));
?????? // 3、WHERE id< 26
?????? // c.add(Restrictions.lt("id",26));
?????? // 4、WHERE id>= 26
?????? //c.add(Restrictions.ge("id", 26));
?????? // 5、WHERE id<= 26
?????? //c.add(Restrictions.le("id", 26));
?????? // 6、WHERE id<> 26
?????? //c.add(Restrictions.ne("id", 26));
?????? // 7、WHEREtitle LIKE ‘%測試%‘
?????? // c.add(Restrictions.like("title","%測試%"));
?????? // 8、WHERE idbetween 23 and 27
?????? //c.add(Restrictions.between("id", 23, 27));
?????? // 9、WHERE idIN (23,25,27)
?????? // List<Integer> allIds= new ArrayList<Integer>();
?????? // allIds.add(23);
?????? // allIds.add(25);
?????? // allIds.add(27);
?????? //c.add(Restrictions.in("id", allIds));
?????? // 10、復雜條件,須要使用and或or來連接各個條件
?????? // WHERE id = 23 OR (id<> 26 AND title LIKE ‘%測試%‘)
?????? c.add(Restrictions.or(Restrictions.eq("id", 23),Restrictions
???????????????????? .and(Restrictions.ne("id", 26),Restrictions.like(
??????????????????????????? "title","%測試%"))));
?
?????? returnc.list();
??? }
假設想增加ORDER BY排序條件,須要使用Order對象。
c.addOrder(Order.desc("id"));
假設想增加統計函數和分組函數,則須要用到Projection這個類
ProjectionList pro =Projections.projectionList();
?????? // 增加統計函數
?????? pro.add(Projections.rowCount());
?????? // 還能夠增加分組條件
?????? pro.add(Projections.groupProperty("title"));
?????? c.setProjection(pro);Hibernate三種狀態;query查詢;ResultTransformer轉換為pojo對象;能夠將query語句寫在xml中;Criteria查詢;ProjectionList總和/f分組等函數