2012-03-22 39 views
1

我正在開發一個使用JPA 2.0和MySQL 5數據庫的應用程序。JPA JPQl或MySQL中的存儲過程

我知道JPA隱藏到數據庫查詢電話,並使其underthehood,以及所有我用的是JPQL,

現在沒有這使得存儲過程不太需要?以及如何在JPA 2.0中使用存儲過程?

+0

[調用從Java/JPA存儲過程]的可能重複(http://stackoverflow.com/questions/3572626/calling-stored-procedure-from-java-jpa) – Perception 2012-03-22 16:35:40

回答

3

存儲過程大多已經失寵(您可以閱讀一些關於爲什麼在這裏的想法:http://www.codinghorror.com/blog/2004/10/who-needs-stored-procedures-anyways.html)。

一般情況下,除非您有性能問題或正在使用舊版系統,否則建議不要使用存儲過程。 對象關係映射解決方案(例如JPA)現在是行業標準,主要是因爲它們可以讓您編寫更少,並且比其他方法(例如直接使用DAO模式和JDBC)更容易維護。

例如考慮增加一個新列到你正在使用的CRUD(創建,檢索,更新,刪除)與表:

  • 使用JPA您的列添加到表和屬性添加到帶註釋的類,就是這樣。
  • 使用存儲過程,您還需要將參數添加到過程以更新或創建新實體,您需要將該列添加到過程中的插入或更新語句中,在某些情況下,我們需要將該列添加到過程中的select子句中。

在關於使用存儲過程,JPA不具有本身的存儲過程的支持,但有兩個辦法可以解決它:

  • 一些JPA實現(如的EclipseLink或Hibernate)支持存儲過程,你可以直接使用它們的實現,你必須看看你使用的是什麼實現。
  • 您可以使用「本地查詢」功能,它可以讓你寫在本地數據庫查詢語言的SQL,例如用於MySQL中,你可以寫這樣的事情:

    Query query = entityManager.createNativeQuery("{ CALL procedure(?) }"); 
    query.setParameter(1, parameterName); 
    

    您還需要記住該過程必須返回結果集,並且不能使用輸出參數。

+2

這個答案是非常堅持己見,引用了傑夫阿特伍德的鏈接博客文章,這在2013年並非如此。使用SP的其他很多理由,除了性能。 – 2013-11-20 10:50:13

+0

使用ORM被認爲是最佳實踐(尤其是在Java和企業中),儘管最佳實踐是趨勢和變化,但我還沒有聽說過SP的復甦。 你能提供一個鏈接或一些信息,說明SPs優於ORM或DAO的優勢嗎? 此外,爲什麼博客帖子在2013年不再相關?我沒有及時瞭解SP的進展,該領域是否有任何改變? – 2013-11-27 19:23:51

+1

從未有過支持或反對使用SP的明確和終端贊成或反對的決定。我只是碰巧在大型企業(Java和非Java)系統上工作,其中SP是必不可少的。我特別關注SQL中的進步,以及PL/SQL和T-SQL等語言,這些語言向我表明,這些供應商有很大的市場來繼續在這方面進行開發工作。此外,傑夫阿特伍德自己也寫了這個,2年後:http://www.codinghorror.com/blog/2006/06/object-relational-mapping-is-the-vietnam-of-computer-science.html – 2013-11-27 19:29:36

1

如果您使用EclipseLink JPA,則可以使用@NamedStoredProcedureQuery批註存儲您的存儲過程。

實施例:

@NamedStoredProcedureQuery(
    name="findAllEmployees", 
    procedureName="EMP_READ_ALL", 
    resultClass=Employee.class, 
    parameters = { 
     @StoredProcedureParameter(
      queryParameter="result", 
      name="RESULT_CURSOR", 
      direction=Direction.OUT_CURSOR 
     ) 
    } 
) 
@Entity 
public class Employee { 
    ... 
} 

您可以參考here