2012-05-30 22 views
1

有沒有一種方法可以映射一個字段在一個hibernate對象中加載一個表查詢?Hibernate映射一個表加入的特定字段

舉一個例子,假設Table_Message的字段爲id(int),message_key(varchar),message_content(Clob),language(varchar)。該表將以不同語言(區域設置)保存消息。

而另一個表映射到一個實體使用休眠。 Comments,字段爲id(int),comment_message_id(varchar),created_date(datetime)comment_message_id是指Table_Messagemessage_key列。

編輯:休眠

Table_Message是不是一個映射實體假設我的評論類是

public class Comment 
{ 
    int id; 
    String message; 
    Date createdDate; 
} 

有沒有辦法讓Hibernate通過message_key與加盟評語表和Table_Message表加載消息默認語言環境(例如「en」)。

基本上有一種方法可以通過運行特定查詢來告訴hibernate加載字段嗎?如果是這樣的話?

我知道如何編寫一個用於加載實體的自定義SQL查詢。但是由於我使用XDoclet,似乎沒有辦法做到這一點。如果有一種方法可以做到這一點,這將是非常方便的。

回答

1

您必須通過comment_message_idmessage_key加入表格並進一步篩選結果language。我假設message_key是獨一無二的。

作爲一個方面的通知:你應該使用整數鍵來獲得更好的性能。

你可以試着寫在SQL數據庫視圖,並創建一個實體不透明看法:

CREATE VIEW Comment_Table_Message AS 
SELECT c.id, c.comment_message_id, c.created_date, m.id AS mid, 
     m.message_content, m.language 
FROM Comment c, Table_Message m 
WHERE c.comment_message_id = t.message_key; 

現在,您可以創建一個實體CommentTableMessage和使用JPQL通過語言來篩選結果:

SELECT x FROM CommentTableMessage x WHERE x.language=?1 

如果Table_Message是你會寫(在JPA術語)一個Hibernate實體:

@Entity 
public class Comment 
{ 
    int id; 
    @ManyToOne() 
    @JoinColumn(name="comment_message_id") 
    TableMessage tableMessage; 
    String message; 
    Date createdDate; 
} 

@Entity 
public class TableMessage { 
    int id; 
    @Id 
    String messageKey; 
    bytes[] messageContent; //I don't know how you want to deal with Blobs? 
    String language; 
} 

有了你可以寫一個簡單的JPA查詢:(你可以使用JPA? - 下一個假設)

SELECT c FROM Comment c WHERE c.tableMessage.language=?1 
+0

的事情是TableMessage不處於休眠映射。所以我認爲這不會起作用....我想我在問題中沒有說清楚。我現在編輯。 – Thihara

+0

我編輯了答案。新解決方案假定您有權在數據庫中創建新視圖。在某些情況下,程序員不能更改數據庫結構(例如,就在程序發佈之前,這種改變是不允許的) –

+0

是的,我也想過創建一個視圖,但這不適用於我。我真的在尋找一個我沒有任何數據庫修改的陳述或類似的特定解決方案。 – Thihara