2016-09-27 83 views
0

我想在Hibernate表格映射/實體類中添加一個字段。休眠 - 選擇/僅加載字段

我想這個字段不被映射到實際的表列,我希望Hibernate不要嘗試插入/更新到數據庫。

但我希望能夠通過DAO中的自定義選擇加載此字段,例如通過

query.addEntity(getPersistentClass().getName());

我得到這個最接近的是通過使場@Transient
後來甚至選擇不加載它的價值。所以這不是我所需要的

這是可能的,如果有的話,怎麼樣?

+0

AFAIK瞬態是不使用ORM模型映射列的唯一方法。如果一個字段沒有映射到數據庫,那麼Hibernate怎麼可能給它分配一個值呢? –

+0

@TimBiegeleisen我的想法是做一個SQL查詢,例如'select t。*,1 as disabled from table t'然後所有其他字段來自表格,我說的'Disabled'字段是從查詢返回的記錄集的'Disabled'列加載的。 –

+0

我不確定我瞭解你的問題。該領域的價值從何而來?它在數據庫中還是某個公式的結果? – Thomas

回答

1

好吧,如果我明白你正在嘗試做的很好的話,我認爲解決的辦法是這樣

@Column(name =「{列名}」,可更新= FALSE)

這樣一旦創建對象,休眠將不會嘗試更新此列

+0

我知道這個「可更新」的東西,但我的問題是我沒有一個專欄來映射這個字段。所以我不希望它被映射到物理表列。不管怎麼說,還是要謝謝你。 –

+1

然後使用瞬態,如果你想從另一個表中得到這個值你可以使用公式 –

+0

我不知道這是可能的。好的,我會在這方面做一些研究,謝謝。 –

1

您的getter必須更聰明一點。 對於爲例,你可以從春天HibernateCallback接口這樣的:

public String getName(Session session) { 
return new HibernateCallback<String>() { 
    @Override 
    public String doInHibernate(Session session) throws HibernateException { 
    return session.createSQLQuery("SELECT NAME FROM MY_TABLE WHERE SOME_CONDITIONS").uniqueResult(); 
    } 
}.doInHibernate(session); 
} 

一個更好的辦法是創建一種在另一個類,你可以訪問會話中執行的方法。 使用該解決方案,您仍然可以將您的字段標記爲@Transient

+0

謝謝,但如果我加載100個實體不會觸發100個單獨的查詢到數據庫?如果是這樣,我不希望這樣。 –

+0

它只會在需要時調用數據庫。但是,一天結束的時候,如果你想要檢索100個不同的實體的信息,它會去100次到DB。也許你可以考慮使用這種方式來檢索所有的實體名稱,並且只需往返於數據庫一次往返。然後將結果映射到正確的實體。 – perbellinio

+0

是的,這就是我想要了解的,如何通過1往返數據庫來完成。 –

0

您可以使用 @Column(name = 「{列名}」,插入=假,可更新= FALSE)

不標記字段作爲@Transient。

這種方式這個屬性不會被插入或更新,但可用於選擇。