1. 程式人生 > >Hibernate三種狀態;query查詢;ResultTransformer轉換為pojo對象;能夠將query語句寫在xml中;Criteria查詢;ProjectionList總和/f分組等函數

Hibernate三種狀態;query查詢;ResultTransformer轉換為pojo對象;能夠將query語句寫在xml中;Criteria查詢;ProjectionList總和/f分組等函數

nfa factor let 統計 保存 pass 數據庫 排序 ESS

版權聲明:本文為博主原創文章,未經博主同意不得轉載。

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)????????當登陸後。要求將當前系統時間,作為最後登陸時間保存到數據庫中時,能夠使用。



Sessiongetload方法的差別?

1)??假設沒有查詢到數據,get會返回null。而load則直接提示錯誤。

2)??使用load查詢時。可能會出現下面錯誤,由於load方式使用的是懶漢式載入方法。

運行load方法時,不立馬查詢數據庫。

當用到查詢出的對象的屬性時。才載入數據。遊離態會報錯


public

void doRemove(Integer id) throws Exception {

?????? // 註意,使用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);

?????? // 1WHERE id =26

?????? //c.add(Restrictions.eq("id", 26));

?????? // 2WHERE id> 26

?????? //c.add(Restrictions.gt("id", 26));

?????? // 3WHERE id< 26

?????? // c.add(Restrictions.lt("id",26));

?????? // 4WHERE id>= 26

?????? //c.add(Restrictions.ge("id", 26));

?????? // 5WHERE id<= 26

?????? //c.add(Restrictions.le("id", 26));

?????? // 6WHERE id<> 26

?????? //c.add(Restrictions.ne("id", 26));

?????? // 7WHEREtitle LIKE ‘%測試%‘

?????? // c.add(Restrictions.like("title","%測試%"));

?????? // 8WHERE idbetween 23 and 27

?????? //c.add(Restrictions.between("id", 23, 27));

?????? // 9WHERE 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、復雜條件,須要使用andor來連接各個條件

?????? // 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分組等函數