2012-12-14 70 views
1

我不知道在哪裏可以找到hibernate的實現機制。我有很多的關於Hibernate的問題,但我們可以從這個啓動:如果沒有明確聲明Transformer,hibernate如何與HQL查詢協同工作

如果有HQL這樣的:

from B b 
where b.x =: x 
and b.y =: y 

和查詢代碼:

Query query = session.createQuery(hql.toString()); 

什麼是將所有字段設置爲B的默認轉換器?我發現這甚至不需要setter或getter來設置值。

或者說,是什麼,這一次它的型差分:

Query query = session.createQuery(hql.toString()).setResultTransformer(Transformers.aliasToBean(B.class)); 

感謝您讀這篇文章,任何想法都歡迎。

+0

請在這裏發佈第二個問題的鏈接。這將有助於解決這個問題的人。 –

回答

9

當默認變壓器使用,預計類爲休眠實體意味着它必須用一些表,並在是

Query query=session.createQuery(hql.toString()).setResultTransformer(Transformers.aliasToBean(B.class)); 

乙第二殼體被映射不冬眠實體(未映射到任何表其簡單的POJO沒有任何hibernate特定的註釋)

例如 有次我們有一個類,我們想根據查詢返回的數據填充數據。這個類是一個簡單的POJO,而不是一個Hibernate實體,所以Hibernate不會識別這個類。 這可以通過使用變形金剛在休眠中完成。讓我們來看一個簡單的例子,展示如何使用變形金剛。首先,讓我們看看一個名爲「UserActivityStat」的簡單POJO類。 該課程包含一些統計信息。我們希望直接通過運行Hibernate HQL來填充實例的統計信息。

public static class UserActivityStat{ 
    private int totalPhotos; 
    private int totalViews; 
    public UserActivityStat() { } 
    public int getTotalPhotos() { 
      return totalPhotos; 
    } 
    public void setTotalPhotos(int totalPhotos) { 
     this.totalPhotos = totalPhotos; 
    } 
    public int getTotalViews() { 
     return totalViews; 
    } 
    public void setTotalViews(int totalViews) { 
     this.totalViews = totalViews; 
    } 
} 

現在,讓我們來看看一個簡單的方法,即使用Hibernate HQL和變壓器類填寫「UserActivityStat」數據

public UserActivityStat getUserActivityStat(User user) { 
    return (UserActivityStat) hibernateSession.createQuery(
      "select count(*) as totalPhotos, sum(p.views) as totalViews " + 
      "from Photo p " + 
      "where p.user = :user " + 
      "p.dateCreated <= :now") 
     .setParameter("user", user) 
     .setTimestamp("now", new Date()) 
     .setResultTransformer(Transformers.aliasToBean(UserActivityStat.class)) 
     .uniqueResult(); 
} 

注意例如,每2列的有一個別名。此別名必須是「UserActivityStat」類中屬性的名稱。還要注意沿着「變形金剛」類使用「setResultTransformer」。

+1

如果它是嵌套屬性,該怎麼辦?例如UserActivityStat具有一個具有屬性名稱的對象「id」。什麼應該是別名?是它的id.name? – jrpalla