2014-01-15 93 views
0

我有幾個實體具有我想從SQL查詢中填充的瞬態屬性。我已經嘗試了幾件事,但還沒有找到正確的組合。Java Hibernate填充瞬態屬性

這裏有一個例子實體

@Id 
@GeneratedValue(strategy=GenerationType.AUTO) 
long id; 
@Size(max=1000) 
String image_url; 

@Transient 
boolean liked; 

@Transient 
long numLikes; 

**getters and setters** for persistent properties 

    public boolean isLiked() { 
    return liked; 
} 

public void setLiked(boolean liked) { 
    this.liked = liked; 
} 

public long getNumLikes() { 
    return numLikes; 
} 

public void setNumLikes(long numLikes) { 
    this.numLikes = numLikes; 
} 

我已經使用@Basic anotation並設置它的獲取方法,渴望

@Basic(fetch = FetchType.EAGER) 

的干將嘗試,但似乎並沒有做任何事情。我也看到它也設置爲懶惰。

我在這裏丟失了什麼東西,會導致列名不映射到這些瞬態屬性之一?

這裏是我的impl代碼。

SQLQuery query = getCurrentSession().createSQLQuery("" + 
      "SELECT * ,count(likes1.liked) as numLikes " + 
      "FROM aboutme " + 
      "left JOIN " + 
      "(" + 
      " select liked, likedObject_id " + 
      " from likes " + 
      " where liked = 1" + 
      ") as likes1 ON aboutme.id = likes1.likedObject_id " + 
      "left join " + 
      "(" + 
      " select likedObject_id, liked " + 
      " from likes " + 
      " where liked = 1 and profile_id = :id" + 
      ") as likes2 on likes2.likedObject_id = aboutme.id " + 
      "WHERE aboutme.profile_id = :id " + 
      "group by aboutme.id"); 

    query.addEntity(AboutMe.class); 
    query.setParameter("id",id); 

    return query.list(); 

我已經嘗試使用該

SQLQuery query = ..."Select count(value that returns properly) as {object.numLikes}..." 


query.addEntity("object",Object.class), 

我來到這裏的錯誤,即它不能爲財產[屬性]別名[別名]

找到列名是什麼我做錯了嗎?

瞬態屬性可能不是我想要做的事。我需要弄清楚的是如何將這些派生列映射到可以返回到前端的對象。我如何設置一個hibernate可以將這些別名列映射到屬性的對象?

+1

瞬態標記爲永遠不應參與數據庫持久性的字段/方法。他們不是持久的。爲什麼你需要像這樣註解這些字段,原因是什麼? – Vaelyr

+0

好吧,也許瞬態屬性不是我需要去的路線。我有一對多的關係。爲喜歡的部分。也許我應該返回列表中的兩個對象並運行它?有沒有辦法返回不屬於表實體的派生屬性?你是怎麼做到的? –

回答

2

Hibernate永遠不會填充您的瞬態字段,什麼是最重要的瞬態字段甚至不是Java序列化過程的一部分。如果你真的需要這個,我會嘗試的是ResultTransformer.alliasToBean,它是用反射將這些值「注入」到課堂中的。

setResultTransformer(Transformers.aliasToBean(Yourclass.class)); 

只是一個快速的想法,不知道它是否會工作。

+0

另外值得注意的是,如果你走這條路線,班級甚至不需要成爲一個實體(這可以說是提問者的班級不是,因爲它實際上並沒有映射到一個表格) –

+0

這個類確實映射到一個表。但我想弄清楚的是如何使帶有額外派生字段的表映射到可以返回到前端的對象。 –

1

我想通了。儘管這很麻煩,但您可以設置瞬態屬性。

在SQLQuery對象上使用addScalar方法可以設置瞬態屬性。但是,如果以這種方式完成,則必須以這種方式設置對象中的所有屬性(Hibernate不會自動填充任何屬性)

此外,您還必須在SQLQuery對象上也使用setResultTransformer方法。所以爲了完成我之前的例子,我必須在我的impl中添加下面的代碼。

// query.addEntity(AboutMe.class); <- this contradicts the setResultTransformer 
query.setParameter("id",id); 

query.addScalar("id",StandardBasicTypes.LONG); 
query.addScalar("image_url",StandardBasicTypes.LONG); 
query.addScalar("liked",StandardBasicTypes.LONG); 
query.addScalar("numLikes",StandardBasicTypes.LONG); 

query.setResultTransformer(Transformers.aliasToBean(Object.class)); 

其中Object是我想使用的類,聲明瞭所有這些屬性。

+0

我覺得你正在試圖讓你的項目非常複雜,這是不必要的。也許應該看看你的數據模型,或者看看一些例子如何做得更好。對我來說,你似乎試圖擺脫Hibernate的意圖。 – Vaelyr

+0

好的。讓我來重新解釋一下這個問題,我該如何將未在同一個表中保存的派生數據放入對象中並將其返回。到目前爲止,這是我見過的唯一途徑。或填充到pojo中,但這將是相同的過程。 –