2011-09-20 65 views
1

在JPA項目中,我需要顯示其數據來自5個相關實體的表。 沒有JPA,我可以編寫一個sql查詢,它將5個數據庫表連接在一起,並根據某些條件進行過濾。 假設過濾標準中涉及的字段只是第一個實體的字段。 使用JPA我可以加載第一個實體的過濾實例,並瀏覽屬性直到最終實體。 我擔心的是,如果我無法使用或者對fecttype = eager註釋犯了錯誤,那麼對數據庫的查詢數量可能會爆炸。 在這種情況下,哪種方法最好? 我想嚴格控制將要執行的sql查詢,所以我可以優化它們,但是如果我用手寫聯接來編寫sql查詢,我是否必須使用'old'結果集來檢索數據?有效地顯示來自多個連接的結果

+0

你能在你的數據庫中創建視圖的? –

+0

是的,我可以。不幸的是,過濾標準是動態的,所以我不能把它們放在視圖內,或者簡單地說我不能如何去做。我關心的是過濾過程:如果我首先創建視圖並過濾它,那麼我必須加入一張非常大的表格,而不僅僅是我感興趣的行。請閱讀以下答案的評論。 – Filippo

+0

好吧,一起使用靜態視圖和動態查詢可能有風險。你能提供更多關於框架或數據庫的信息嗎? –

回答

0

您可以使用JPA的內置查詢語言JPQL嗎? (它確實有一個JOIN操作符。)但請注意,這不是標準的SQL,只是類似的東西,所以請仔細閱讀JPQL文檔。是的,這仍然是嵌入在Java代碼中的純文本查詢,這是一種恥辱,但是,嘿,這就是Java可以支持開發過程的程度。

這裏的主要優勢在於,您可以獲得實體對象作爲查詢的結果 - 儘管您仍然需要從Object轉換它們。您還可以直接在查詢字符串中使用對象(記錄)及其成員變量(屬性),所以這是從舊的JDBC開始的一步。

或者你也可以選擇Criteria API,但坦白地說,我的經驗並不是很好。語法非常糟糕,你基本上最終會自己構建低級查詢。這顯然是Java最糟糕的......但至少包含查詢的字符串可以從代碼中消除。我不確定這是否值得。

檢查此頁面瞭解更多信息和示例:

http://download.oracle.com/javaee/6/tutorial/doc/gjise.html

+0

我同意標準API,這是新手真正的噩夢。我的想法如下:創建一個只有很少幾行的'怪胎'視圖只是爲了創建一個實體(讓我們稱之爲summarydata)。使用連接創建一個JPQL查詢並添加動態過濾條件。將其轉換爲summarydata並顯示在jsf h:datatable中。它應該工作,不是嗎? – Filippo